На первый взгляд этот код выглядит вполне нормально
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()
игнорируются данные могут быть потеряны, и программа не заметит этого? В FilterOutputStream.close
не упоминается какая-либо опасность (где BufferedOutputStream
наследует close()
from) API.
ОБНОВЛЕНИЕ: Чтобы имитировать ошибку ввода-вывода во время закрытия(), я сменил тест на запись во флэш-память, добавив 5 секунд сна перед bout.close(), и пока тест спал, я удалил Flash от USB. Тест завершился без исключений, но когда я вставил Flash и проверил его - 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)