8

当我将数据写入流时,我期望以下代码会引发异常:

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,但是在我当前的环境中,FileOutputStream 可能会在 BufferedWriter 关闭之前关闭。FileOutputStream 不应该抛出一个应该向上移动的 IOException,直到它碰到我的 try/catch 块并打印堆栈跟踪?

如果我尝试调用 fs.write(65),则会引发异常。

4

1 回答 1

10

在 write 调用之后尝试刷新。缓冲流可能尚未尝试将内容写入底层流,因此没有意识到底层流已关闭。

编辑:

刚试了一下。使用代码:

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)
于 2010-03-16T19:55:48.270 回答