我需要关闭流吗?

时间:2016-11-06 12:29:36

标签: java

我是否需要在以下示例中关闭FileOutputStream?为什么?

FileOutputStream fos = new FileOutputStream("bytes.info");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(data);
oos.close();

3 个答案:

答案 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。