2010-03-16 5 views
8

j'attendais le code suivant pour lancer une exception quand je goto écrire des données sur le flux:Java BufferedWriter, OutputStreamWriter capable d'écrire à FileOutputStream fermé

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

Je me rends compte que je fermer la BufferedWriter, mais Dans mon environnement actuel, il est possible que FileOutputStream soit fermé avant la fermeture de BufferedWriter. Le FileOutputStream ne devrait-il pas lancer une exception IOException qui devrait remonter la chaîne jusqu'à ce qu'elle atteigne mon bloc try/catch et imprimer la trace de la pile?

Si j'essaie d'appeler fs.write (65), alors il déclenche une exception.

Répondre

9

Essayez de rincer après l'appel d'écriture. Le flux mis en mémoire tampon peut ne pas avoir essayé d'écrire le contenu dans le flux sous-jacent pour le moment, et donc pas réalisé que le flux sous-jacent a été fermé.

EDIT:

Je viens de l'essayer. Avec le code:

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

vous obtenez l'exception suivante:

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

Merci! Je ne peux pas croire que je n'ai pas essayé ça, les tests unitaires me donnent tellement de concentration, parfois je rate l'évidence. – craineum

+0

Pourquoi ne lancerait-il pas une exception à 'ow.write (65)', cependant? Le OutputStreamWriter n'est pas mis en mémoire tampon. –

+0

Si vous lisez le javadoc pour le OutputStreamWriter (l'intro) vous voyez qu'il est aussi tamponné. –

Questions connexes