Java BufferedWriter, OutputStreamWriter может писать в закрытый FileOutputStream

Я ожидал, что следующий код вызовет исключение, когда я перейду к записи данных в Stream:

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), он выдаст исключение.


person craineum    schedule 16.03.2010    source источник


Ответы (1)


Попробуйте выполнить сброс после записи. Буферизованный поток, возможно, еще не пытался записать контент в базовый поток и, следовательно, не осознавал, что базовый поток был закрыт.

РЕДАКТИРОВАТЬ:

Просто попробовал. С кодом:

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)
person Alexander Torstling    schedule 16.03.2010
comment
Спасибо! Не могу поверить, что я не пробовал это сделать, модульные тесты позволяют мне так сосредоточиться, что я иногда упускаю очевидное. - person craineum; 16.03.2010
comment
Но почему бы ему не вызвать исключение на ow.write(65)? OutputStreamWriter не буферизуется. - person Michael Myers; 16.03.2010
comment
Если вы прочитаете javadoc для OutputStreamWriter (вступление), вы увидите, что он также буферизован. - person Alexander Torstling; 17.03.2010