1

这就是我正在做的事情,以防止 a在 a 中完成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

根据下面的评论尝试一个 normal 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();
        }
    }
}

这似乎更好:)

4

2 回答 2

2

我不认为你描述的可能。您的 try-with-resources 只是关闭lines,而不是 br. lines关闭的是它自己br;并且没有关闭lines就无法关闭br

更重要的是,我不明白你为什么避免 close br。您一直在阅读到阅读器的末尾(通过执行collect);在那之后保持它打开有什么意义?

于 2013-12-02T00:41:54.140 回答
1

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

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

更何况,如果关闭了 BufferedReader ,返回的 StreamBufferedReader.lines()不会关闭!(在 b119 中)Files.lines()改为使用。

于 2013-12-18T14:09:30.150 回答