如何防止try-with-resources从lines()(Stream <string>)关闭BufferedReader?</string>

时间:2013-12-02 00:22:36

标签: java java-8 java-stream autocloseable

这是我在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();
        }
    }
}

这似乎更好:)

2 个答案:

答案 0 :(得分:2)

我不认为你描述的是可能的。您尝试使用资源只是关闭lines不是 brlines本身正在关闭br;如果不关闭lines,就无法关闭br

更重要的是,我不明白为什么你希望避免关闭br。你一直在阅读读者的最后(通过执行collect);那之后保持开放的重点是什么?

答案 1 :(得分:1)

除非需要关闭底层资源,否则无需关闭Stream。

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

MOREOVER BufferedReader.lines()返回的Stream如果关闭则不会关闭BufferedReader! (在b119中)改为使用Files.lines()