В Java 8 добавлен Files.lines() метод для создания Stream<String>. Опять же, этот метод с потерями, потому что разделители строк удалены. Если при чтении файла возникает an IOException, он упаковывается в an UncheckedIOException, поскольку Stream не принимает лямбды, которые генерируют проверенные исключения.
Для этого Stream действительно нужен close() вызов; это плохо документировано в API, и я подозреваю, что многие люди даже не замечают, что у Stream есть close() метод. Обязательно используйте ARM-блок, как показано.
Если вы работаете с источником, отличным от файла, вы можете использовать lines() метод в BufferedReader вместо этого.
Использование памяти
Если ваш файл достаточно мал по сравнению с доступной памятью, чтение всего файла сразу может работать нормально. Однако, если ваш файл слишком большой, лучшим подходом может быть чтение по одной строке за раз, обработка ее, а затем удаление перед переходом к следующей. Потоковая обработка таким образом может исключить общий размер файла как фактор, влияющий на ваши требования к памяти.
Character encoding
One thing that is missing from the sample in the original post is the character encoding. This encoding generally can't be determined from the file itself, and requires meta-data such as an HTTP header to convey this important information.
The StandardCharsets class defines some constants for the encodings required of all Java runtimes:
There are some special cases where the platform default is what you want, but they are rare. You should be able justify your choice, because the platform default is not portable. One example where it might be correct is when reading standard input or writing standard output.
Note: This answer largely replaces my Java 6 version. The utility of Java 7 safely simplifies the code, and the old answer, which used a mapped byte buffer, prevented the file that was read from being deleted until the mapped buffer was garbage collected. You can view the old version via the "edited" link on this answer.
Scannerscanner=newScanner( newFile("poem.txt") ); Stringtext= scanner.useDelimiter("\\A").next(); scanner.close(); // Put this call in a finally block
Or, if you want to set the charset:
Scannerscanner=newScanner( newFile("poem.txt"), "UTF-8" ); Stringtext= scanner.useDelimiter("\\A").next(); scanner.close(); // Put this call in a finally block
Or, with a try-with-resources block, which will call scanner.close() for you: