2010-03-16 13 views
8

mi aspettavo il seguente codice per generare un'eccezione quando ho goto scrivere dati alla Corrente:Java BufferedWriter, OutputStreamWriter in grado di scrivere a FileOutputStream chiuso

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

mi rendo conto che avrei dovuto chiudere la BufferedWriter, ma in Nel mio ambiente corrente, potrebbe essere possibile chiudere FileOutputStream prima che BufferedWriter venga chiuso. Non dovrebbe il FileOutputStream lanciare una IOException che dovrebbe risalire la catena finché non colpisce il mio try/catch block e stampare la traccia dello stack?

Se provo a chiamare fs.write (65), viene generata un'eccezione.

risposta

9

Provare a lavare dopo la chiamata di scrittura. Il flusso bufferizzato potrebbe non aver ancora provato a scrivere il contenuto nel flusso sottostante, quindi non si è reso conto che il flusso sottostante era chiuso.

MODIFICA:

Appena provato. Con il codice:

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

si ottiene la seguente eccezione:

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

Grazie! Non posso credere di non averlo provato, i Test unitari mi hanno così focalizzato, a volte mi manca l'ovvio. – craineum

+0

Perché non lanciare un'eccezione a 'ow.write (65)', però? OutputStreamWriter non è bufferizzato. –

+0

Se si legge javadoc per OutputStreamWriter (l'introduzione), si vede che è anche bufferizzato. –