Ответ 1
Это использует новый поток с лямбдой в тестовом приложении.
Я бы сказал, что это самый предпочтительный и лаконичный путь, потому что:
1) Он автоматически закроет поток, когда закончится, и правильно выбросит все исключения.
2) Результат этого ленив. Каждая строка считывается после обработки последней строки. Это также ближе к исходной спецификации обработки файлов на основе Java.
3) Он печатает каждую строку таким образом, который наиболее точно напоминает данные в файле.
4) Это менее интенсивно для памяти, поскольку он не создает промежуточный список или массив, такие как Files.readAllLines(...)
5) Это наиболее гибко, поскольку предоставленный объект Stream имеет много других применений и функций для работы с данными (преобразования, коллекции, предикаты и т.д.)
try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
stream.forEach(System.out::println);
}
Если путь и кодировка предоставлены, и потребитель может взять любой объект, это также работает:
try (Stream stream = Files.lines(path,charset)) {
stream.forEach(System.out::println);
}
С обработкой ошибок:
try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) {
stream.forEach(System.out::println);
} catch (IOException ex) {
// do something with exception
}