在处理BufferedOutputStream时,发现它在关闭流后在上面写时不会抛出IOException

为了验证我的结果,我检查了FileOutputStream,发现它在关闭后尝试在其上书写时正在抛出IOException

public class Test {
    public static void main(String[] args) {
        try {
            // Created a byte[] barry1 barry2
            byte[] barry1 = { '1', '3' };
            byte[] barray2 = { '2', '4' };
            OutputStream os = new BufferedOutputStream(
                  new FileOutputStream("abc.txt", false));
            // Writing to stream
            os.write(barry1);
            os.close();
            os.write(barray2); // this suceeds - bug

            os = new FileOutputStream("abc.txt", true);
             //Writing to stream
            os.write(barry1);
            os.close();
            os.write(barray2); // crashes here, correct.
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

有人可以帮我这个忙,为什么这种行为不同?

最佳答案

在处理BufferedOutputStream时,发现它在关闭流后在其上写入时不会引发IOException。
BufferedOutputStream代码只是没有这种检查,但是FileOutputStream也没有。在这两种情况下,只有将IO实际上写入磁盘时,操作系统才会“抛出” IOException。不是Java代码正在检测流已关闭。顺便说一句,这可能意味着某些本机实现根本不抛出。
FileOutputStreamos.write(...)相比,在BufferedOutputStream上引发异常的原因是它正在将IO立即写入底层本机层。如果将os.flush()调用添加到BufferedOutputStream之后,则将看到相同的异常,因为这会强制将其内部缓冲区写出。

OutputStream os = new BufferedOutputStream(new FileOutputStream("abc.txt", false));
os.write(barry1);
os.close();
os.write(barray2); // this suceeds – unfortunate behavior
os.flush();  // adding this line throws an IOException

在查看os.write()BufferedOutputStream方法(实际上在close()基类中)时,您可以看到输出流未设置为FilterOutputStream或其他任何设置:
public void close() throws IOException {
    try {
      flush();
    } catch (IOException ignored) {
    }
    out.close();
}

我也不喜欢它在此处关闭时忽略IOExceptions的事实。哇。这告诉我,我们应该始终在null之前手动调用flush(),这是我特别不喜欢的模式。

现在将该代码与close()进行比较:
public void close() throws IOException {
    synchronized (lock) {
        if (out == null) {
            return;
        }
        try {
            flushBuffer();
        } finally {
            out.close();
            out = null;   // good doggie
            cb = null;
        }
    }
}
BufferedWriter.close()不吃异常,并将委托的BufferedWriter.close()设置为Writer。更好的IMO。

关于java - BufferedOutputStream不引发I/O异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43085152/

10-10 03:16