web-dev-qa-db-ja.com

try-with-resourcesを使用する場合、flush()呼び出しは必要ですか?

_try-with-resources_は暗黙的にflush()を呼び出しますか?

もしそうなら、次のコードスニペットで、bw.flush()は安全に削除できますか?

_static void printToFile1(String text, File file) {
    try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
        bw.write(text);
        bw.flush();
    } catch (IOException ex) {
        // handle ex
    }
}
_

ps。公式文書にはそれについての説明がありません:

https://docs.Oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.htmlhttps://docs.Oracle.com/javase/8/docs/api/ Java/lang/AutoCloseable.html

21
okwap

Closeable および AutoCloseable は、フラッシュについて何も知らない汎用インターフェースです。したがって、リソースの解放に関するいくつかの単語を除いて、ドキュメントにはそれに関する情報はありません。

一方、 Writer は、フラッシュについて何かを知っている、より具体的な目的の抽象クラスです。メソッドのドキュメントの抜粋 Writer.close()

ストリームを閉じます最初にフラッシュします

したがって、-はい-ライターを使用する場合、closeは常にflushにもなります。これは基本的に、クロージングが実際に何をするのかを調べるときに、使用している具象クラスのドキュメントを参照する必要があることを意味します。

16
Seelenvirtuose

try-with-resource ブロックを使用すると、リソースは自動的に閉じられます。このプロセスの一部として、フラッシュも自動的に呼び出されます。

close BufferedWriterのメソッドのドキュメントに記載されているように:

ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。

9
akhil_mittal

BufferedWriter.close() のjavadocを引用:

ストリームを閉じます最初にフラッシュします

4
Andreas

この場合に記述されるコードの最小量:

try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
    bw.write("Test");
} catch (IOException e) {
    // handle exception
}

したがって、javadocで説明されているように、 close メソッドによって呼び出されるため、 flush メソッドを明示的に呼び出す必要はありません。

ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。以前に閉じたストリームを閉じても効果はありません。

この動作は Writer クラスから継承されるため、 BufferedWriter の他に、同じ動作が次の方法でも提供されます。 CharArrayWriterFilterWriter =、 OutputStreamWriterPipedWriterPrintWriterStringWriter

この動作は、 Writer の特定の実装に固有であるため、 tryWithResources または AutoCloseable のドキュメントには記載されていません。 Writer extends Closeable であるため、try {}ブロックを終了するときに close メソッドを呼び出し、closeメソッドは最初に フラッシュ すでに述べたように。

3
Olimpiu POP

他の回答が_try-with-resources_ではなくBufferedWriterに焦点を当てている理由がよくわかりません。

私も、仕様が見つからなかったか、_try-with-resources_ステートメントがFlushableのオブジェクトに対してflush()を呼び出していると述べています。

https://docs.Oracle.com/javase/specs/jls/se13/html/jls-14.html#jls-14.20.

ベンダー固有の実装の文書化されていない/指定されていない動作に依存しないでください。

_try (OutputStream o = open()) {
    //writeSome
    o.flush(); // won't hurt!
}
_
1
Jin Kwon

Javdocsから:

Try-with-resourcesステートメントは、1つ以上のリソースを宣言するtryステートメントです。リソースは、プログラムが終了した後に閉じる必要があるオブジェクトです。 try-with-resourcesステートメントは、ステートメントの最後で各リソースが閉じられるようにします。 _Java.lang.AutoCloseable_を実装するすべてのオブジェクトを含む、_Java.io.Closeable_を実装する任意のオブジェクトをリソースとして使用できます。

BufferedWriter.close()は、次のように明示的に述べています。

ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。以前に閉じたストリームを閉じても効果はありません。

1
Rahul Tripathi