java - 使用 try-finally block 处理输入流有什么好处?

标签 java file-io inputstream try-finally

这是我在网上找到的一个Java示例:

try{
      //use buffering
      InputStream file = new FileInputStream("quarks.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);
      try{
        //deserialize the List
        List<String> recoveredQuarks = (List<String>)input.readObject();
        //display its data
        for(String quark: recoveredQuarks){
          System.out.println("Recovered Quark: " + quark);
        }
      }
      finally{
        input.close();
      }
} catch(ClassNotFoundException ex){
      //some exception handling
}

在上面,在关闭输入之前使用 try-finally block 对输入执行一些处理有什么好处?换句话说,上面的代码比这样的代码有什么好处:

try{
      //use buffering
      InputStream file = new FileInputStream("quarks.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);
      List<String> recoveredQuarks = (List<String>)input.readObject();
      for(String quark: recoveredQuarks){
          System.out.println("Recovered Quark: " + quark);
      }
      input.close();
} catch(ClassNotFoundException ex){
      //some exception handling
}

最佳答案

有很大的不同:想象一下以下情况

  InputStream file = new FileInputStream("quarks.ser");
  InputStream buffer = new BufferedInputStream(file);
  ObjectInput input = new ObjectInputStream (buffer);
  try{
    //do sth
    throw new RuntimeException();
    //do sth else
  }
  finally{
    input.close();
  }

在这种情况下,使用finally block 时,会抛出异常,但finally block 会被执行,并且您的输入因此会关闭。

如果您的代码是

  InputStream file = new FileInputStream("quarks.ser");
  InputStream buffer = new BufferedInputStream(file);
  ObjectInput input = new ObjectInputStream (buffer);
  //do sth
  throw new RuntimeException();
  //do sth else
  input.close();

您的输入流无法正确关闭。

<小时/>

但是从 Java 7 开始,最优雅的版本是使用 try-with-resources ,正如对您的问题的评论中提到的:

try (InputStream file = new FileInputStream ("quarks.ser");
    InputStream buffer = new BufferedInputStream (file);
    ObjectInput input = new ObjectInputStream (buffer);) {
  //do sth
  throw new RuntimeException ();
  //do sth else
}

关于java - 使用 try-finally block 处理输入流有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32718129/

相关文章:

javascript - 什么是 AppRTC,它对创建移动视频通话应用程序有何帮助?

java - 创建包含类和 jar 文件的 jar

c - 在另一个文件中搜索一个文件的一部分

java - 在 Java Servlet 中读取文件到字符串

java - 我需要在每个新输入流上调用 close() 吗?

java - 将输入流转换为位图

java - Eclipse 项目中图像的路径

java - Android Studio 2.1.3 中的 Retrolambda 3.3 : error configuring project ':app'

c++ - 将字符串设置为文件内容c++