1

これは、 a で終了したBufferedReaderときに a が閉じられないようにするために私が行っていることです: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();
        }
    }
}

それはより良いようです:)

4

2 に答える 2

2

あなたが説明したことが可能だとは思いません。あなたの try-with-resources は、linesではなく br、 を閉じているだけです。lines閉じているのはそれ自体ですbr。そして、閉じlinesずに閉じる方法はありませんbr

さらに、なぜ閉鎖を避けたいbrのか理解できません。collect( を実行して)リーダーの最後まで読んでいます。その後、それを開いたままにする意味は何ですか?

于 2013-12-02T00:41:54.140 に答える
1

基になるリソースを閉じる必要がない限り、ストリームを閉じる必要はありません。

ほとんどのストリーム (メモリ内コレクションを指すものなど) は、閉じる必要はまったくありません。

さらに、によって返された Stream は、BufferedReader.lines()閉じられた場合に BufferedReader を閉じません! (b119)Files.lines()代わりに使用します。

于 2013-12-18T14:09:30.150 に答える