Прочитайте весь текст із файлу
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 безпечно спрощує код, і стара відповідь, яка використовувала відображений байтовий буфер, не дозволила видалити прочитаний файл, поки зібраний буфер не зібрав сміття. Ви можете переглянути стару версію через посилання "відредагований" на цю відповідь.