在 try-with-resources 中使用 Stream
时,应该关闭阅读器。
鉴于此:
try(Stream<String> lines = new BufferedReader(reader).lines()) {
return lines.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
}
...阅读器没有被关闭??
这个测试失败了:
AtomicBoolean closed = new AtomicBoolean(false);
Reader r = new StringReader(" Line1 \n Line2") {
@Override
public void close() {
super.close();
closed.set(true);
}
};
try(Stream<String> lines = new BufferedReader(r).lines()) {
lines.map(it -> trim ? it.trim() : it)
.collect(Collectors.toList());
}
assertTrue("Reader was not closed.",closed.get());
最佳答案
我实际上并没有使用过 try-resources 语法。希望我的回答有意义。
根据我的理解,自动关闭是关闭声明中声明的资源,没有别的。
因此,try(Stream<String> lines = new BufferedReader(r).lines()) {
只是关闭 lines
,但不是没有分配变量的缓冲读取器。
如果您打算同时关闭缓冲读取器和流(您真的需要关闭流吗?),iirc,您可以在 try 语句中包含多行:
try (BufferedReader br = new BufferedReader(r);
Stream<String> lines = br.lines()) {
//....
}
诸如此类。 (还没有尝试编译它,希望它能工作:P)
关于java - 为什么try-with-resources获取 `Stream<String>`时BufferedReader没有关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20319417/