Java BufferedWriter, OutputStreamWriter capable d'écrire à FileOutputStream fermé
-
20-09-2019 - |
Question
Je me attendais le code suivant pour lancer une exception quand je goto écrire des données sur le flux:
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 ferme la BufferedWriter, mais dans mon environnement actuel, il peut être possible pour le FileOutputStream à fermer avant la BufferedWriter est fermée. Ne doit pas être FileOutputStream lancer une IOException qui devrait remonter la chaîne jusqu'à ce qu'elle touche mon bloc try / catch et imprimer la trace de la pile?
Si je tente d'appeler fs.write (65), il jette une exception.
La solution
Essayez de rinçage après l'appel d'écriture. Le flux tampon pourrait ne pas avoir essayé d'écrire encore le contenu du flux sous-jacent, et donc pas rendu compte que le flux sous-jacent a été fermé.
EDIT:
juste essayé. 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)