2012-05-15 37 views
4

以下哪一項是關閉和聲明inputStream的首選方式。如何聲明並關閉InputSteam?

InputStream is = null; 
String md5; 
try{ 
    is = new FileInputStream(FILE.getAbsoluteFile()); 
    md5 = UTILS.getMD5Info(is); 
} finally{ 
    if(is != null) 
     is.close(); 
} 

InputStream is = new FileInputStream(FILE.getAbsoluteFile()); 
String md5; 
try{ 
    md5 = UTILS.getMD5Info(is); 
} finally{ 
    is.close(); 
} 

我看不出太大的區別兩者之間,但第二個方法看起來它有點短越好。如果我們不打算捕獲異常並且只是對垃圾收集inputStream感興趣,是否有任何用於初始化try塊內的輸入流的用法?

+0

第一個比較好。 –

回答

6

如果IOException在try和finally之間被捕獲,第一個也會處理FileInputStream的構造函數拋出IOException的情況,而第二個則不會。他們不會做同樣的事情。現在,第二個更清潔。

由於Java 7,最好的辦法是使用try-與資源聲明:

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) { 
    md5 = UTILS.getMD5Info(is); 
} 
+0

*第二*更清潔或第一*是? – dj18

+0

「現在,第二個更清潔」是什麼含糊? –

+0

只是澄清,因爲你解釋了爲什麼第一個更好,所以我想知道你是否打算繼續以同樣的態度繼續說第一個更清潔。你能說明什麼使第二個「更清潔」? – dj18

4

第二種方法的問題是FileInputStream構造函數可能會拋出FileNotFoundException異常,您不會在您指定的try塊內捕獲異常(如果您想要捕獲此類異常),所以使用此方法可以減少控制。

我會去第一個。

6

如何使用Java 7的功能try-with-resources

try (InputStream is = new FileInputStream(FILE.getAbsoluteFile())) { 
    ... 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

正如它,如果你想成爲絕對精確是很醜陋(不要忘記,任何讀者可能會在close()拋出一個附加IOException!):

InputStream is = null; 

try { 
    is = new FileInputStream(FILE.getAbsoluteFile()); 

    // Your md5() magic here 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    if (is != null) { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

在你的第二個版本,當構造函數拋出異常時(例如,無法找到該文件或者您沒有權限訪問該文件),您不會處理這種情況。

如果您還想處理該情況,則需要在try-catch塊之前聲明InputStream(或將throws IOException添加到當前函數定義中)。

但是,您需要檢查它是否已被正確初始化,即finally塊中不是null。此外,如果您想要close()流,則必須處理可能的IOException(通常,如果您能夠打開流,則永遠不會發生這種情況)。