簡體   English   中英

我應該使用close或closeQuietly來關閉輸出流嗎?

[英]Should I use method close or closeQuietly to close an output stream?

當我們需要關閉輸出流時,我們有兩個選擇。

  1. closeQuietly意味着關閉一個流,沒有異常拋出。

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

眾所周知,輸出流會在關閉時將一個/幾個字符寫入文件末尾,如果這些寫入錯誤,文件也無法正確打開,如ZipoutputStream。

如果我使用第一個,我將有一些失敗的風險。 如果我使用第二個,它會讓我的代碼不友好。

有人可以給我一些建議嗎?

很抱歉沒有明確地描述這個問題。

我的意思是如何安全地進行IO操作。 如果資源的發布失敗,它將讓調用者知道。

謝謝你的所有答案。 特別感謝@Don Roby給我一個包含@Fabian Barney回答的最佳答案的鏈接

由於Java 7 IOUtils.closeQuietly已經過時,唯一合理的解決方案是try-with-resources resources自動關閉資源

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

請注意,它還解決了正確打開/關閉多個資源的問題

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

並且它也不會抑制close()可能拋出的IOException,這正是closeQuietly所做的。

close()一些實現可能包括其他邏輯,如寫入最終字節或flush() '數據。 示例是FilterOutputStream

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

所以我的意見是:捕獲IOException並使用包含的cause-exception拋出特定於應用程序的異常,例如:

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

如果你堅持不拋出異常,那么至少記錄是否有ERROR狀態。

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

根據經驗,我從不吞下異常,所以根據我寫的代碼所要求的邏輯,我可能會

  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出現以來,我更喜歡(如Evgeniy所述)使用try-with-resources:

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

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

干凈的代碼是好事,但在任何妥協的情況下,它可以為您提供更好的結果,如維護,調試在這種情況下,我們應該這樣做。 它可以以更好的方式完成,如自定義異常或使用上面建議的Java7功能,但根據我的經驗,編寫更多行的成本是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM