从文档中了解到:
流有一个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
(BufferedReader
的in
字段不为null
),但是接下来的这句话让我感到困惑,因为这个例子中也涉及I/O,对吧?
通常只有源自IO通道的流(例如由Files.lines(Path, Charset)返回的流)才需要关闭。
如果不是这种情况,我需要关闭两个实例还是只需关闭BufferedReader
?
理想情况下,我希望从某个方法返回一个Stream<String>
,而无需客户端担心读取器。目前,我创建了一个Stream
装饰器,它还会关闭读取器,但如果不必要,那将更容易些。
BufferedReader
是否关闭?在try
块内部吗? - user1907906close
关闭流后进行了测试,并使用调试器检查了字段。自动关闭的尝试是为了说明我想要如何使用它。 - nhaarman