Stream的javadoc说明:
Stream有一个BaseStream.close()方法并实现AutoCloseable接口,但几乎所有的Stream实例在使用之后都不需要关闭。通常情况下,只有那些源是IO通道(比如Files.lines(Path, Charset)返回的那些)的流需要关闭。大多数流都由集合、数组或生成函数支持,不需要特殊的资源管理。(如果某个流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。)
因此,绝大部分时候可以像这样用一行代码来使用Streams:collection.stream().forEach(System.out::println);
但对于Files.lines
和其他依赖资源的流,必须使用try-with-resources语句,否则会泄露资源。
这让我感到很容易出错,也很不必要。由于Stream只能迭代一次,我认为不存在Files.lines
的输出不应该在迭代完成后立即关闭的情况,因此实现应该在任何终端操作结束时隐式调用close。我理解正确吗?