2015-09-22 48 views
0

这里是一个Java例子,我在网上找到:使用try-finally模块处理输入流有什么好处?

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块与输入来执行一些处理关闭输入过吗?换句话说,将上面的代码有什么好处了这样的事情:

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 
} 
+3

的好处是:输入被处理后关闭,即使抛出异常。 – Stultuske

+6

虽然当然这些天尝试资源是一个更简单的方法。 –

回答

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(); 
    } 

在这种情况下,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(); 

你的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 
} 
3

使用try /最后的好处...或更好还是尽量-与资源,是它在很大程度上防止资源泄漏,如这些:

等。一般来说,这些问题的发生是因为流/套接字/任何未关闭的代码存在一些路径。如果该路径过于频繁,则尝试打开新的流等等会失败,因为应用程序已经使用了所有可用的文件描述符。如果您正确使用finally您可以确保描述符在所有重要情况下都被释放。

还应该注意的是,你在网上发现的例子是不正确的......至少在理论上。如果BufferedInputStreamObjectInputStream的构造函数发生异常,则finally块将不会执行,并且FileInputStream将被泄漏。

一种更好的方式来写如下:

try (InputStream file = new FileInputStream("quarks.ser"); 
    InputStream buffer = new BufferedInputStream(file); 
    ObjectInputStream input = new ObjectInputStream (buffer)) { 

    // do stuff 

} catch (ClassNotFoundException ex){ 
     // handling exception 
}