2010-03-16 7 views
8

ich den folgenden Code erwartete eine Ausnahme zu werfen, wenn ich lese Daten schreiben Sie an die Stream:Java BufferedWriter, Output Lage geschlossene Outputstream zu schreiben

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

Ich weiß, dass ich die BufferedWriter schließen sollte, aber in In meiner aktuellen Umgebung kann es möglich sein, dass der FileOutputStream geschlossen wird, bevor der BufferedWriter geschlossen wird. Sollte der FileOutputStream nicht eine IOException auslösen, die sich in der Kette nach oben bewegen sollte, bis sie den try/catch-Block trifft und den Stack-Trace ausgibt?

Wenn ich versuche, fs.write (65) aufzurufen, wird eine Ausnahme ausgelöst.

Antwort

9

Versuchen Sie, nach dem Schreibanruf zu spülen. Der gepufferte Stream hat möglicherweise noch nicht versucht, den Inhalt in den zugrunde liegenden Stream zu schreiben, und hat daher nicht erkannt, dass der zugrunde liegende Stream geschlossen wurde.

EDIT:

Probieren Sie es einfach aus. Mit dem 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(); 
} 

erhalten Sie die folgende Ausnahme:

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

Dank! Ich kann nicht glauben, dass ich das nicht versucht habe, Unit Tests haben mich so konzentriert, dass ich manchmal das Offensichtliche vermisse. – craineum

+0

Warum würde es nicht eine Ausnahme bei 'ow.write (65)' werfen? Der OutputStreamWriter ist nicht gepuffert. –

+0

Wenn Sie das Javadoc für den OutputStreamWriter (das Intro) lesen, sehen Sie, dass es auch gepuffert ist. –

Verwandte Themen