用于流的Javadoc指出:为什么Files.lines(和类似的Streams)不会自动关闭?
流有BaseStream.close()方法和实施AutoCloseable,但几乎所有的流实例也确实需要使用后不会被关闭。通常,只有源数据流是IO通道的数据流(如Files.lines(Path,Charset)返回的数据流)需要关闭。大多数流由集合,数组或生成函数支持,不需要特殊的资源管理。 (如果某个流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。)
因此,绝大多数情况下,人们可以在一行内使用Streams collection.stream().forEach(System.out::println);
但是对于Files.lines
和其他资源支持的流,必须使用try-with-resources语句或者泄漏资源。
这让我很容易出错并且不必要。由于Streams只能迭代一次,在我看来,不存在这样一种情况,即迭代后不应该关闭Files.lines
的输出,因此实现应该简单地在任何终端的末尾隐式调用close操作。我错了吗?
根据我的经验,当你不想让它们自动关闭的流几乎不可能使用。你无法重新开启已经关闭的*。标记,重置,寻找。根据实施情况,您可以使用同一个流多次读取一些数据。 – ebyrob
@ebyrob不与那个流 – assylias
不比一个简单的尝试与资源,但如果你真的需要用一个单一的表达式:http://stackoverflow.com/a/31179709/2711488 – Holger