java - 为什么try-with-resources获取 `Stream<String>`时BufferedReader没有关闭?

标签 java java-8 java-stream try-with-resources autocloseable

在 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/

相关文章:

查找重复组的 Java 模式

java - 反序列化时如何正确使用 transient 关键字?

java - XSLT 1 : XPath - select/extract a number from a string, 带默认值

java-8 - 坚持使用 Java 8 流

java - 使用 Java 8 java.time.LocalDate,你可以计算农历新年日期吗?

java - 流是否使用流源的特征?

java - 从字符串构建 List<T>

java - 使用java流获取字符串占位符列表

java - 使用 Java8 Streams 求和列表中各点之间的距离

java - RecyclerView 不显示任何内容