【问题标题】:How to prevent a try-with-resources from closing a BufferedReader from lines() (Stream<String>)?如何防止 try-with-resources 从 lines() (Stream<String>) 关闭 BufferedReader?
【发布时间】:2023-03-24 10:07:01
【问题描述】:

这就是我正在做的事情,以防止lines()try-with-resources 中完成时关闭BufferedReader

这是一个通用实用程序,它可以在很多阅读器上运行,而不仅仅是文件..

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&lt;String&gt;的关闭不会同时关闭Bufferedreader

按照下面的 cmets 尝试普通的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();
        }
    }
}

这似乎更好:)

【问题讨论】:

  • 不要使用 try-with 资源;使用正常的尝试。
  • 我认为最好的办法是不要对资源进行尝试,但您是否验证过closeReader的价值。
  • 谢谢。我会试试的。

标签: java java-8 java-stream autocloseable


【解决方案1】:

我认为你所描述的是不可能的。您的 try-with-resources 只是关闭了 linesnot br。关闭br的是lines本身;如果不关闭br,就无法关闭lines

此外,我不明白您为什么想要避免关闭br。您正在阅读到读者的最后(通过执行collect);在那之后保持打开有什么意义?

【讨论】:

  • 我同意。但是,我认为我有一些方法在阅读器(自定义阅读器)仍然需要打开的地方。我必须搜索才能找到......看起来我可以摆脱 close 参数!但是了解自动关闭会发生什么以及如何解决它仍然是一个很好的问题:)
【解决方案2】:

您不需要关闭 Stream,除非您需要关闭底层资源。

大多数流(例如指向内存中集合的流)根本不需要关闭。

MOREOVERBufferedReader.lines() 返回的 Stream 不会关闭 BufferedReader ! (在 b119 中)改用 Files.lines()

【讨论】:

    猜你喜欢
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2020-01-01
    • 2021-10-08
    • 2017-12-04
    • 2014-05-05
    • 2017-05-06
    相关资源
    最近更新 更多