在处理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代码正在检测流已关闭。顺便说一句,这可能意味着某些本机实现根本不抛出。FileOutputStream
与os.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/