Java BufferedWriter, OutputStreamWriter, способный записывать в закрытый FileOutputStream
-
20-09-2019 - |
Вопрос
Я ожидал, что следующий код выдаст исключение, когда я приступлю к записи данных в поток:
File file = new File("test.txt");
FileOutputStream fs = new FileOutputStream(file);
OutputStreamWriter ow = new OutputStreamWriter(fs);
BufferedWriter writer = new BufferedWriter(ow);
fs.close();
try {
ow.write(65);
writer.write("test");
} catch (Exception e) {
e.printStackTrace();
}
Я понимаю, что мне следует закрыть BufferedWriter , но в моей текущей среде может оказаться возможным закрыть FileOutputStream до закрытия BufferedWriter .Разве FileOutputStream не должен выдавать исключение IOException, которое должно перемещаться вверх по цепочке, пока не попадет в мой блок try / catch и не напечатает трассировку стека?
Если я попытаюсь вызвать fs.write(65), то это вызовет исключение.
Решение
Попробуйте выполнить очистку после вызова write.Буферизованный поток, возможно, еще не пытался записать содержимое в базовый поток и, следовательно, не осознал, что базовый поток был закрыт.
Редактировать:
Просто попробовал это.С помощью кода:
File file = new File("test.txt");
FileOutputStream fs = new FileOutputStream(file);
OutputStreamWriter ow = new OutputStreamWriter(fs);
BufferedWriter writer = new BufferedWriter(ow);
fs.close();
try {
ow.write(65);
writer.write("test");
writer.flush();
} catch (Exception e) {
e.printStackTrace();
}
вы получаете следующее исключение:
java.io.IOException: Bad file descriptor
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
at java.io.BufferedWriter.flush(BufferedWriter.java:236)
at Test.main(Test.java:16)