【发布时间】:2015-08-31 23:25:51
【问题描述】:
来自the docs:
Streams 有一个 BaseStream.close() 方法并实现 AutoCloseable, 但几乎所有流实例实际上都不需要关闭 使用后。通常,只有源为 IO 通道的流(例如 因为 Files.lines(Path, Charset)) 返回的那些将需要关闭。 大多数流由集合、数组或生成器支持 功能,不需要特殊的资源管理。 (如果一个流 确实需要关闭,它可以声明为一个资源 try-with-resources 语句。)
当我在BufferedReader 上使用lines() 方法创建Stream<String> 时,如下所示,关闭Stream 是否也会关闭BufferedReader?
try (Stream<String> lines = new BufferedReader(new InputStreamReader(process.getInputStream())).lines()) {
// Do stuff
}
// Is the BufferedReader, InputStreamReader and InputStream closed?
我尝试过的一些非常快速的测试说不(BufferedReader 的in 字段不是null),但是我被下面的句子弄糊涂了,因为这个例子是 I/O嗯,对吧?
通常,只有源是 IO 通道的流(例如 因为 Files.lines(Path, Charset)) 返回的那些需要关闭。
如果没有,我是否需要关闭 两个 实例,或者关闭 BufferedReader 就足够了?
理想情况下,我想从某个方法返回一个Stream<String>,而不必让客户担心读者。目前,我创建了一个 Stream 装饰器,它也关闭了阅读器,但如果没有必要,它会更容易。
【问题讨论】:
-
您在哪里测试
BufferedReader是否已关闭?在try块内? -
我在
Stream上显式调用close后对其进行了测试,并使用调试器检查了该字段。自动关闭尝试是我想如何使用它的一个例子。