【问题标题】:Java BufferedWriter, OutputStreamWriter able to write to closed FileOutputStreamJava BufferedWriter、OutputStreamWriter 能够写入已关闭的 FileOutputStream
【发布时间】:2011-01-28 07:00:20
【问题描述】:

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

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),则会引发异常。

【问题讨论】:

    标签: java fileoutputstream bufferedwriter


    【解决方案1】:

    在 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)
    

    【讨论】:

    • 谢谢!不敢相信我没有尝试过,单元测试让我如此专注,我有时会错过显而易见的事情。
    • 为什么它不会在ow.write(65) 抛出异常呢? OutputStreamWriter 未缓冲。
    • 如果您阅读了 OutputStreamWriter 的 javadoc(介绍),您会发现它也被缓冲了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多