4

Streamが try-with-resources で使用されている場合は、リーダーを閉じる必要があります。

これを考えると:

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());
4

2 に答える 2

10

私は実際には 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)

于 2013-12-02T01:31:44.140 に答える