2010-03-16 10 views
8

spodziewałem następujący kod do wyjątek, kiedy goto zapisu danych do strumienia:Java BufferedWriter, OutputStreamWriter możliwość zapisu zamkniętym FileOutputStream

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(); 
} 

zdaję sobie sprawę, że należy zamknąć BufferedWriter, ale w moje obecne środowisko, może być możliwe zamknięcie FileOutputStream przed zamknięciem BufferedWriter. Czy plik FileOutputStream nie powinien generować wyjątku IOException, który powinien przesuwać się w górę łańcucha, dopóki nie dotrze do mojego bloku try/catch i wydrukować ślad stosu?

Jeśli spróbuję wywołać funkcję fs.write (65), zgłasza wyjątek.

Odpowiedz

9

Spróbuj spłukać po wywołaniu zapisu. Być może buforowany strumień nie próbował jeszcze zapisać zawartości do strumienia bazowego, a tym samym nie zdał sobie sprawy, że strumień bazowy został zamknięty.

EDIT:

Właśnie spróbowałem. Z kodem:

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(); 
} 

pojawić się następujący wyjątek:

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) 
+1

Dzięki! Nie mogę uwierzyć, że tego nie próbowałem, testy jednostek sprawiają, że jestem taki skupiony, czasami tęsknię za oczywistością. – craineum

+0

Dlaczego jednak nie wyrzuciłoby wyjątku w 'ow.write (65)', chociaż? OutputStreamWriter nie jest buforowany. –

+0

Jeśli czytasz javadoc dla OutputStreamWriter (intro), widzisz, że jest on również buforowany. –

Powiązane problemy