2010-03-16 55 views
8

我期待下面的代碼拋出一個異常,當我轉到數據寫入流:的Java的BufferedWriter,OutputStreamWriter能夠寫入封閉FileOutputStream中

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

我意識到,我應該關閉的BufferedWriter,但在我當前的環境,可能會在BufferedWriter關閉之前關閉FileOutputStream。 FileOutputStream不應該拋出一個IOException,它應該向上移動鏈,直到它碰到我的try/catch塊並打印堆棧跟蹤?

如果我嘗試調用fs.write(65),那麼它會拋出一個異常。

回答

9

在寫入調用之後嘗試刷新。緩存的流可能沒有嘗試將內容寫入底層流,因此沒有意識到底層流已關閉。

編輯:

剛試過。隨着代碼:

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

你出現以下情況例外:

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

謝謝!不敢相信我沒有嘗試過,單元測試讓我如此專注,我有時候會想念那些明顯的。 – craineum 2010-03-16 20:06:30

+0

但是爲什麼它不會在'ow.write(65)'處拋出異常呢? OutputStreamWriter不被緩衝。 – 2010-03-16 20:57:50

+0

如果您閱讀OutputStreamWriter的javadoc(介紹),您會看到它也被緩衝。 – 2010-03-16 22:37:36