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

Jon*_*Jon 0 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
}
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 7

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

  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();
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用finally块,抛出异常,但执行finally块并因此关闭输入.

如果您的代码是

  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();
Run Code Online (Sandbox Code Playgroud)

您的InputStream无法正常关闭.


但是从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
}
Run Code Online (Sandbox Code Playgroud)