В javadoc для Stream указано:
Потоки имеют метод BaseStream.close () и реализуют AutoCloseable, но почти все экземпляры потока на самом деле не нужно закрывать после использования. Как правило, только потоки, источником которых является канал ввода-вывода (например, те, которые возвращаются Files.lines (Path, Charset)), требуют закрытия. Большинство потоков поддерживаются коллекциями, массивами или генерирующими функциями, которые не требуют специального управления ресурсами. (Если поток требует закрытия, его можно объявить как ресурс в инструкции try-with-resources.)
Следовательно, в подавляющем большинстве случаев можно использовать потоки в однострочном режиме, например collection.stream().forEach(System.out::println);
, но для Files.lines
и других потоков с поддержкой ресурсов необходимо использовать оператор try-with-resources, иначе ресурсы будут утечкой.
Это кажется мне подверженным ошибкам и ненужным. Поскольку потоки могут быть повторены только один раз, мне кажется, что нет ситуации, когда вывод Files.lines
не должен закрываться, как только он был повторен, и поэтому реализация должна просто неявно вызывать close в конце любого терминала операция. Я ошибаюсь?