Прочитайте весь текст із файлу
Java 11 додала метод readString () для читання невеликих файлів як String
, зберігаючи термінатори рядків:
String content = Files.readString(path, StandardCharsets.US_ASCII);
Для версій між Java 7 та 11, ось компактна, надійна ідіома, яка міститься в утиліті:
static String readFile(String path, Charset encoding)
throws IOException
{
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
Прочитайте рядки тексту з файлу
Java 7 додала зручний метод для читання файлу у вигляді рядків тексту, представлених як List<String>
. Цей підхід є "втратним", оскільки роздільники ліній позбавлені кінця кожного рядка.
List<String> lines = Files.readAllLines(Paths.get(path), encoding);
Java 8 додала Files.lines()
метод отримання a Stream<String>
. Знову ж таки, цей метод є втратним, оскільки роздільники ліній позбавлені. Якщо IOException
під час читання файлу виникає "an" UncheckedIOException
, він загортається у , оскільки Stream
не приймає лямбда, які викидають перевірені винятки.
try (Stream<String> lines = Files.lines(path, encoding)) {
lines.forEach(System.out::println);
}
Для Stream
цього потрібен close()
дзвінок; це погано документовані на API, і я підозрюю , що багато людей навіть не помічають , Stream
маєclose()
метод. Обов’язково використовуйте блок ARM, як показано.
Якщо ви працюєте з джерелом, відмінним від файлу, ви можете використовувати lines()
метод вBufferedReader
замість цього .
Використання пам'яті
Перший метод, який зберігає розриви рядків, може тимчасово вимагати пам'яті в кілька разів більше розміру файлу, тому що на короткий час міститься нераціональний вміст файлу (байтовий масив) та декодовані символи (кожен з яких становить 16 біт, навіть якщо закодований як 8 біт у файлі) постійно перебувають у пам'яті. Це найбезпечніше застосувати до файлів, які, як ви знаєте, малі відносно наявної пам’яті.
Другий метод, читаючи рядки, як правило, більш ефективний у пам'яті, оскільки вхідний байтовий буфер для декодування не повинен містити весь файл. Однак це все ще не підходить для файлів, які є дуже великими щодо наявної пам'яті.
Для читання великих файлів вам потрібен інший дизайн для вашої програми, який читає шматок тексту з потоку, обробляє його, а потім переходить до наступного, використовуючи той же блок пам'яті фіксованого розміру. Тут "великий" залежить від специфікацій комп'ютера. В даний час цей поріг може становити багато гігабайт оперативної пам’яті. Третій метод, використовуючи a, Stream<String>
- це один із способів зробити це, якщо у ваших "записах" трапляються окремі рядки. (Використання readLine()
методу BufferedReader
є процедурним еквівалентом цього підходу.)
Кодування символів
Одне, чого не вистачає у зразку в оригінальній публікації, - це кодування символів. Є деякі особливі випадки, коли платформа за замовчуванням - це те, що ви хочете, але вони рідкісні, і ви повинні бути в змозі виправдати свій вибір.
StandardCharsets
Клас визначити деякі константи для кодування необхідного всіх середовищ виконання Java:
String content = readFile("test.txt", StandardCharsets.UTF_8);
За замовчуванням платформа доступна у самому Charset
класі :
String content = readFile("test.txt", Charset.defaultCharset());
Примітка. Ця відповідь значною мірою замінює мою версію Java 6. Утиліта Java 7 безпечно спрощує код, і стара відповідь, яка використовувала відображений байтовий буфер, не дозволила видалити прочитаний файл, поки зібраний буфер не зібрав сміття. Ви можете переглянути стару версію через посилання "відредагований" на цю відповідь.