簡體   English   中英

關閉Stream會關閉BufferedReader源嗎?

[英]Does closing a Stream close the BufferedReader source?

來自文檔

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?

一些非常快速測試我試着說不(對in該領域BufferedReadernull ),但后來我感到困惑的下面這句話,因為這個例子是I / O,以及,對不對?

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

如果沒有,我是否需要關閉兩個實例,或者關閉BufferedReader足夠?


理想情況下,我想從某種方法返回Stream<String> ,而不會讓客戶擔心讀者。 目前,我已經創建了一個Stream裝飾器,它也關閉了閱讀器,但如果沒有必要,它會更容易。

如果要將讀取器的關閉推遲到傳遞的Stream,則需要調用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);
        }
    };
}

不,似乎沒有。 使用時創建流

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

它沒有傳遞任何對BufferedReader引用

在您的問題中,您沒有顯示如何創建作為new BufferedReader(in)參數的Reader 但是根據我自己的測試,沒有理由認為Stream關閉了這個論點。

執行以下操作應該關閉所有人:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.stream.Stream;

public class SOPlayground {

    public static void main(String[] args) throws Exception {
        try (Reader in = new InputStreamReader(new FileInputStream(new File("/tmp/foo.html")));
                BufferedReader reader = new BufferedReader(in);
                Stream<String> lines = reader.lines()) {
            lines.forEach(System.out::println);
        }        
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM