![](/img/trans.png)
[英]Does closing the BufferedReader/PrintWriter close the socket connection?
[英]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
該領域BufferedReader
不null
),但后來我感到困惑的下面這句話,因為這個例子是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.