我是否需要在以下示例中关闭FileOutputStream?为什么?
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();
答案 0 :(得分:2)
是的,你需要关闭流。保留FileOutputStream
未关闭会导致某些已成功写入流的数据无法保存到文件中。如果程序打开多个文件流,则不关闭它们会因为本机资源耗尽而导致失败(同时打开太多文件)。
FileOutputStream
管理由close
方法发布的本机资源。该类也有一个终结器,它也会释放资源。作为释放本机资源的一部分,流完成缓冲数据的写入(如果有的话)。但是,由于JVM不保证将在每个对象上调用终结器,因此无法调用close
会导致保留未写入缓冲数据的风险。
答案 1 :(得分:2)
如果没有抛出异常,则FileOutputStream
将被ooo.close()
关闭。
writeObject
中抛出的异常会阻止任何流被关闭。所以close
调用应该在finally块中。
ObjectOutputStream
可能会在其构造函数中引发异常。它在构造函数中写入流头,这可能导致异常。在这种情况下,需要关闭FileOutputStream
,但无法调用oos.close()
,因为没有ObjectOutputStream
的引用。所以你真的需要两个单独的close
调用,每个流一个,最后一个块。
使用try-with-resources为您完成所有这些工作:
try(
FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos)
) {
oos.writeObject(data);
}
答案 2 :(得分:0)
当然,您必须关闭FileOutputStream文件。如果不是,有时您保存到文件中的数据可能无法保存,并且在执行程序后最终会出现空文件。并且您可能希望尝试使用资源,因此您不必手动关闭它并且可以同时执行异常处理部分。
try (FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos));{
}catch(){}
如果你没有使用try with resources,请手动关闭finally块中的文件流。
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try{
fos = new FileOutputStream("bytes.info");
oos = new ObjectOutputStream(fos));
oos.writeObject(data);
}catch(){
}finally{
if(fos != null){
fos.close();
}
if(oos != null){
oos.close();
}
}
必须检查这些文件流是否为空。因为如果它们为null,则会出现另一个错误。还是最好使用try with resources。