2010-03-16 70 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