这是我在BufferedReader
完成lines()
时阻止try-with-resources
关闭的原因:
这是一个通用实用程序,它可以在很多读者上运行,而不仅仅是文件..
public static List<String> getLines(Reader reader, boolean trim, boolean closeReader) throws IOException {
Objects.requireNonNull(reader);
BufferedReader br = new BufferedReader(reader) {
@Override
public void close() throws IOException {
if (closeReader) {
super.close();
}
}
};
try (Stream<String> lines = br.lines()) {
return lines.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
}
}
是否有更好的控制方式,以便Stream<String>
的关闭也不会关闭Bufferedreader
?
根据以下评论尝试正常try
,它看起来像这样:
public static List<String> getLines(Reader reader, boolean trim, boolean closeReader) throws IOException {
Objects.requireNonNull(reader);
BufferedReader br = new BufferedReader(reader);
try {
return br.lines()
.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
} finally {
if (closeReader) {
br.close();
}
}
}
这似乎更好:)
答案 0 :(得分:2)
我不认为你描述的是可能的。您尝试使用资源只是关闭lines
,不是 br
。 lines
本身正在关闭br
;如果不关闭lines
,就无法关闭br
。
更重要的是,我不明白为什么你希望避免关闭br
。你一直在阅读读者的最后(通过执行collect
);那之后保持开放的重点是什么?
答案 1 :(得分:1)
除非需要关闭底层资源,否则无需关闭Stream。
大多数Streams(例如指向内存中集合的Streams)根本不需要关闭。
MOREOVER ,BufferedReader.lines()
返回的Stream如果关闭则不会关闭BufferedReader! (在b119中)改为使用Files.lines()
。