2010-03-16 8 views
8

que estaba esperando el siguiente código para lanzar una excepción cuando Goto escribir datos en la Corriente:Java BufferedWriter, OutputStreamWriter escribir en FileOutputStream cerrado

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

me doy cuenta que debería cerrar la BufferedWriter, pero en mi entorno actual, es posible que FileOutputStream se cierre antes de que BufferedWriter se cierre. ¿No debería FileOutputStream lanzar una IOException que debería moverse hacia arriba de la cadena hasta que llegue a mi bloque try/catch e imprimir el seguimiento de la pila?

Si intento llamar a fs.write (65), arroja una excepción.

Respuesta

9

Pruebe a enjuagar después de la llamada de escritura. Es posible que la secuencia amortiguada no haya intentado escribir el contenido en la secuencia subyacente y, por lo tanto, no se haya dado cuenta de que la secuencia subyacente estaba cerrada.

EDITAR:

Lo intenté. Con el código:

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

se obtiene la siguiente excepción:

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

Gracias! No puedo creer que no lo haya intentado, Unit Tests me pone tan concentrado, a veces echo de menos lo obvio. – craineum

+0

¿Por qué no arrojaría una excepción en 'ow.write (65)'? El OutputStreamWriter no está almacenado en el búfer. –

+0

Si lee el javadoc para OutputStreamWriter (la introducción), verá que también está almacenado en el búfer. –

Cuestiones relacionadas