2015-12-29 46 views
-2

我正在使用Java SDK8並創建了一個inputStream和outputStream對象。try-with-resources在Java SE 7及更高版本中的聲明

在Java SE 7之前,無論try語句是否正常完成,我都可以使用finally塊來確保關閉這些資源。 我在Java SE 7和更高版本中讀到,我可以使用try-with-resources語句,並且在我使用的資源實現接口java.lang.AutoCloseable時,我不需要關閉finally塊中的資源任何更多。

我的問題是: 1.是否正確,如果我正在使用實現接口java.lang.AutoCloseable的資源,我不需要關閉它在finally塊中,它將被關閉,即使會拋出異常?如果是這樣,是否有一個必須存在的先決條件? (例如,在try塊中創建資源?)
2. try-with-resources聲明究竟意味着什麼?

非常感謝!

+0

相關:先試與資源等同於Java 1.6的(http://stackoverflow.com/questions/23611940/try-with-resources-equivalent-in-java-1-6) – zapl

+2

[Java7試用資源聲明優點]的可能重複(http://stackoverflow.com/questions/17739362/java7-try- with-resources-statement-advantage) – mkierc

+0

只需幾次點擊就能給你答案 – Dici

回答

2
  1. 它是正確的,如果我使用實現接口java.lang.AutoCloseable的資源,我不需要關閉它在finally塊,它會被關閉,即使一個異常會被拋出?

是的。

如果是這樣,是否有一個必須存在的先決條件? (例如,在try塊中創建資源?)

資源必須在try-with-resources語句(見下文)中創建。

  1. try-with-resources聲明究竟意味着什麼?

這裏一試,與資源聲明:

try (FileReader fr = FileReader(path)) { 
    // use fr here 
} 

注意FileReader的初始化是如何try(新()部分)。這就是聲明如何知道以後需要關閉什麼。

(在the tutorial更多,但我不喜歡他們的第一個例子,因爲它依賴於A)的BufferedReader構造函數從不拋出的事實,和B),其BufferedReader將關閉FileReaderBufferedReader被關閉的事實。這些都是爲BufferedReader真實的,但它是在一般情況下,一個貧窮的例子。)

全堅韌不拔的細節,包括一個什麼樣的try-with-resources看起來像舊try/catch/finally格式,在the specification翻譯。

請注意,您可以在語句中創建多個資源;他們在創造相反的順序關閉:

try (
    FileReader fr = 
     new FileReader(fileName); 
    NiftyThingUsingReader nifty = 
     new NiftyThingUsingReader(fr) 
) { 
    // ...use `nifty` here 
} 

雖然你可能

try (
    NiftyThingUsingReader nifty = 
     new NiftyThingUsingReader(new FileReader(fileName)) 
) { 
    // ...use `nifty` here 
} 

...你必須知道肯定NiftyThingUsingReader(FileReader)不會拋出一個異常,並且NiftyThingUsingReader#close將關閉底層的FileReader,因爲它將而不是由try-with-resources本身處理。如果您不確定,請將它們分開,以便即使NiftyThingUsingReader(FileReader)構造函數拋出並且即使NiftyThingUsingReader#close未關閉它,try-with-resources語句也會關閉FileReader

資源不必相互依賴(直接);例如,這就是你想要的輸入和輸出要處理一個相當普遍的情況:

try (
    java.util.zip.ZipFile zf = 
     new java.util.zip.ZipFile(zipFileName); 
    java.io.BufferedWriter writer = 
     java.nio.file.Files.newBufferedWriter(outputFilePath, charset) 
) { 
    // Enumerate each entry 
    for (java.util.Enumeration entries = 
          zf.entries(); entries.hasMoreElements();) { 
     // Get the entry name and write it to the output file 
     String newLine = System.getProperty("line.separator"); 
     String zipEntryName = 
      ((java.util.zip.ZipEntry)entries.nextElement()).getName() + 
      newLine; 
     writer.write(zipEntryName, 0, zipEntryName.length()); 
    } 
} 
相關問題