[英]Should I close output stream if I get FileNotFoundException? And IOException?
[英]Should I use method close or closeQuietly to close an output stream?
當我們需要關閉輸出流時,我們有兩個選擇。
closeQuietly意味着關閉一個流,沒有異常拋出。
try { close(out) } catch(IOException e) { }
關
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狀態。
如果不這樣做,可能會導致很難分析錯誤報告或奇怪的行為。
根據經驗,我從不吞下異常,所以根據我寫的代碼所要求的邏輯,我可能會
記錄異常:
try { close(out); } catch(IOException e) { // log the exception log.info("An error has occurred during stream closing: {}", e); }
包裹它進一步拋出它
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.