документация Javadoc для потока гласит:Почему Files.lines (и подобные потоки) не закрываются автоматически?
Streams есть метод с BaseStream.close() и реализовать AutoCloseable, но почти все экземпляры потока на самом деле не должны быть закрыты после использования. Как правило, только потоки, источник которых является каналом ввода-вывода (например, те, которые возвращаются файлами Files.lines (Path, Charset)), требуют закрытия. Большинство потоков поддерживаются коллекциями, массивами или генерирующими функциями, которые не требуют специального управления ресурсами. (Если поток требует закрытия, он может быть объявлен как ресурс в отчете try-with-resources.)
Таким образом, в большинстве случаев можно использовать потоки в одном слое, например collection.stream().forEach(System.out::println);
, но для Files.lines
и других потоков с ресурсами, необходимо использовать оператор try-with-resources или ресурсы утечки.
Это поражает меня как подверженного ошибкам и ненужного. Поскольку Streams можно только повторить один раз, мне кажется, что нет ситуации, когда вывод Files.lines
не должен быть закрыт, как только он был повторен, и поэтому реализация должна просто вызвать неявно в конце любого терминала операция. Я ошибаюсь?
По моему опыту, потоки, которые автоматически закрываются, когда вы не хотите их, почти невозможно работать. Вы не можете повторно открыть то, что уже было закрыто * для * вас. Отметить, сбросить, искать. Вы можете прочитать некоторые данные более одного раза с одним и тем же потоком в зависимости от реализации. – ebyrob
@ebyrob не с этим потоком – assylias
Не лучше простого try-with-resource, но если вам действительно нужно сделать это с помощью одного выражения: http://stackoverflow.com/a/31179709/2711488 – Holger