2013-06-04 109 views
7

當我們需要關閉一個輸出流時,我們有兩個選擇。我應該使用close方法還是close方法關閉輸出流?

  1. close靜靜地表示關閉一個流,沒有例外拋出。

    try { 
        close(out) 
    } catch(IOException e) { 
    } 
    
  2. 接近

    try { 
        close(out) 
    } catch(IOException e) { 
        throw anException; 
    } 
    

已知,輸出流會寫一個/幾個字符到文件關閉時,如果這些文字出現錯誤,該文件也不能結束正確打開如ZipoutputStream。

如果我使用第一個,我會遇到失敗關閉的風險。 如果我使用第二個,它會讓我的代碼不友好。

有人能給我一些建議嗎?

很抱歉不清楚地描述問題。

我的意思是如何安全地獲得IO操作。如果某個資源的發佈失敗,它會讓來電者知道。

感謝您的回答。尤其要感謝@Don羅比給我其中包含最佳回答@Fabian巴尼

+0

[可以安全使用Apache commons-io IOUtils.closeQuietly?](http://stackoverflow.com/questions/14436453/is-it-safe-to-use-apache-commons-io- ioutils-closequietly) –

+0

'catch(IOException e){throw anException; }'沒有意義 - 你需要聲明'拋出IOException'來做到這一點,所以你可以跳過try/catch – artbristol

回答

11

由於Java 7 IOUtils.closeQuietly成爲過時的和唯一的合理的解決辦法回答的鏈接是try-with-resources它會自動關閉資源

try (InputStream is = new FileInputStream(file)) { 
    ... 
} 

注這也解決了問題,正確地打開/關閉多個資源

try (InputStream is = new FileInputStream(infile); OutputStream out = new FileOutputStream(outfile)) { 
    ...   
} 

而且它也不會取消IOException異常是close()可能拋出,W這正是closeQuietly所做的。

3

close()一些實現可包括其他的邏輯像寫入最後字節或flush()「荷蘭國際集團的數據。例子是FilterOutputStream

現在對流的基於網絡通道或外部USB驅動器的情況進行成像。兩者可能隨時消失。執行close()時可能會發生。

所以我認爲:趕上IOException異常,並用附帶的原因,除了把你的應用程序特定的異常,如:

} catch (IOException e) 
{ 
    throw new IOManagementException(e); 
} 

如果你堅持在不引發異常,然後登錄,如果有錯誤狀態至少。

如果不這樣做,可能會導致很難分析錯誤報告或奇怪的行爲。

+0

這是一個很好的答案,但它會讓我的代碼不友好。我已經知道另一種解決方案,就是那個try {..... out.close();} catch(IOException e){拋出異常;} finally {IOUtils.closeQuietly(out)} –

0

作爲一個經驗法則,我從來沒有吞下例外,所以取決於由我寫的代碼所需的邏輯,我可能

  1. 登錄異常:

    try { 
        close(out); 
    } catch(IOException e) { 
        // log the exception 
        log.info("An error has occurred during stream closing: {}", e); 
    } 
    
  2. 總結它的把它進一步

    try { 
        close(out); 
    } catch(IOException e) { 
        throw new MyException(e); 
    } 
    

因爲JDK 7的時候,我喜歡(由葉夫根尼提到的)使用try-與資源:

try (OutputStream out = // create output stream) { 
    // do the writing 
} // at this point the stream is closed 

這將關閉以適當和安全的方式你正在處理的數據流。

0

乾淨的代碼是好東西,但如果妥協它可以給你更好的結果,如維護,在這種情況下調試我們應該這樣做。它可以通過更好的方式完成,如自定義異常或使用上面建議的Java7功能,但根據我的經驗寫入更多行的代價是值得的。

相關問題