关闭流是否会关闭 BufferedReader 源?

2022-09-04 20:52:37

文档中

流具有 BaseStream.close() 方法并实现 AutoCloseable,但几乎所有流实例在使用后实际上并不需要关闭。通常,只有源是 IO 通道的流(例如 Files.lines(Path,Charset)返回的流)才需要关闭。大多数流由集合、数组或生成函数提供支持,这些函数不需要特殊的资源管理。(如果流确实需要关闭,则可以在 try-with-resources 语句中将其声明为资源。

当我在 a 上创建一个 using 方法时,如下所示,关闭 是否也会关闭 ?Stream<String>lines()BufferedReaderStreamBufferedReader

try (Stream<String> lines = new BufferedReader(new InputStreamReader(process.getInputStream())).lines()) {
  // Do stuff
}

// Is the BufferedReader, InputStreamReader and InputStream closed?

我尝试过一些非常快速的测试说不(的领域不是),但是我对下面的句子感到困惑,因为这个例子也是I / O,对吧?inBufferedReadernull

通常,只有源是 IO 通道的流(例如 Files.lines(Path,Charset)返回的流)才需要关闭。

如果没有,我是否需要关闭这两个实例,还是关闭实例就足够了?BufferedReader


理想情况下,我想从某种方法返回Stream<String>,而不必担心读者。目前,我已经创建了一个装饰器,它也可以关闭读取器,但如果没有必要,那就更容易了。


答案 1

如果要将读取器的关闭推迟到传递的流,则需要调用 Stream.onClose()

static Stream<String> toStream(BufferedReader br){
    return br.lines().onClose(asUncheckedAutoCloseable(br));
}


static Runnable asUncheckedAutoCloseable(AutoCloseable ac) {
    return () -> {
        try {
            ac.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    };
}

答案 2

不,似乎没有。当使用以下命令创建流时

    return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
            iter, Spliterator.ORDERED | Spliterator.NONNULL), false);

它不会传递任何对BufferedReader


推荐