一見、このコードは完全に問題ないように見えます
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("1.txt"));
byte[] bytes = new byte[4096];
bout.write(bytes);
bout.close();
close()
しかし、よく見ると、次のように実装されていることがわかります。
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
エラーが原因で無視されたためにflush()
データが失われ、プログラムがそれに気付かない可能性はありますか?API FilterOutputStream.close
(からBufferedOutputStream
継承する場所)の危険性については言及されていません。close()
更新: close()中のIOエラーをシミュレートするために、フラッシュメモリに書き込むようにテストを変更し、bout.close()の前に5秒間のスリープを追加し、テストのスリープ中にUSBからフラッシュを削除しました。テストは例外なく終了しましたが、フラッシュを挿入して確認したところ、1.txtがありませんでした。
次に、close()をオーバーライドします
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("g:/1.txt")) {
@Override
public void close() throws IOException {
flush();
super.close();
}
};
もう一度テストを実行して、
Exception in thread "main" java.io.FileNotFoundException: g:\1.txt (The system cannot the specified path)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
at test.Test1.main(Test1.java:10)