2015-09-22 52 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 
}