Нужно ли обертывать код в try-with-resources, чтобы убедиться, что основной файл закрыт?
List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
Нужно ли обертывать код в try-with-resources, чтобы убедиться, что основной файл закрыт?
List<String> rows = Files.lines(inputFilePath).collect(Collectors.toList());
Поскольку javadoc перегруженного Files#lines(Path, Charset)
метода указывает
Возвращенный поток инкапсулирует a
Reader
. Если своевременное удаление файла требуются системные ресурсы, конструкцияtry-with-resources
должна использоваться для обеспечения того, чтобы метод закрытия потока был вызван после потоковые операции завершены.
Итак, положите Stream
, возвращенный lines
в инструкции try-with-resources
. (Или close соответствующим образом.)
Существует трюк, чтобы выполнить реализацию Stream
при вызове close()
после операции терминала:
List<String> rows = Stream.of(Files.lines(inputFilePath)).flatMap(s->s)
.collect(Collectors.toList());
Он просто создает поток, инкапсулирующий поток строк как один элемент, и использует flatMap
с функцией идентификации (Function.identity()
тоже будет работать), чтобы снова включить его в поток строк.
Интересным моментом является свойство Stream.flatMap(…)
:
Каждый отображаемый поток закрывается после того, как его содержимое было помещено в этот поток.
Таким образом, приведенный выше код закроет поток строк. Хотя он выглядит более кратким, у него есть недостаток, чем попытки с ресурсами, которые текущая реализация flatMap
не содержит ленивой оценки, что здесь не актуально, поскольку вы собираете все строки в список в любом случае. Но его нужно помнить при использовании этого трюка в других сценариях.
Для кода вопросов as-is существует еще более простое решение:
List<String> rows = Files.readAllLines(inputFilePath);
Считывает все строки и закрывает все ресурсы...