_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
Closeable
および AutoCloseable
は、フラッシュについて何も知らない汎用インターフェースです。したがって、リソースの解放に関するいくつかの単語を除いて、ドキュメントにはそれに関する情報はありません。
一方、 Writer
は、フラッシュについて何かを知っている、より具体的な目的の抽象クラスです。メソッドのドキュメントの抜粋 Writer.close()
:
ストリームを閉じます最初にフラッシュします。
したがって、-はい-ライターを使用する場合、close
は常にflush
にもなります。これは基本的に、クロージングが実際に何をするのかを調べるときに、使用している具象クラスのドキュメントを参照する必要があることを意味します。
try-with-resource ブロックを使用すると、リソースは自動的に閉じられます。このプロセスの一部として、フラッシュも自動的に呼び出されます。
close BufferedWriterのメソッドのドキュメントに記載されているように:
ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。
BufferedWriter.close() のjavadocを引用:
ストリームを閉じます最初にフラッシュします。
この場合に記述されるコードの最小量:
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 の他に、同じ動作が次の方法でも提供されます。 CharArrayWriter 、 FilterWriter =、 OutputStreamWriter 、 PipedWriter 、 PrintWriter 、 StringWriter 。
この動作は、 Writer の特定の実装に固有であるため、 tryWithResources または AutoCloseable のドキュメントには記載されていません。 Writer extends Closeable であるため、try {}ブロックを終了するときに close メソッドを呼び出し、closeメソッドは最初に フラッシュ すでに述べたように。
他の回答が_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!
}
_
Javdocsから:
Try-with-resourcesステートメントは、1つ以上のリソースを宣言するtryステートメントです。リソースは、プログラムが終了した後に閉じる必要があるオブジェクトです。 try-with-resourcesステートメントは、ステートメントの最後で各リソースが閉じられるようにします。 _
Java.lang.AutoCloseable
_を実装するすべてのオブジェクトを含む、_Java.io.Closeable
_を実装する任意のオブジェクトをリソースとして使用できます。
BufferedWriter.close()
は、次のように明示的に述べています。
ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。以前に閉じたストリームを閉じても効果はありません。