我看scala-arm庫,通過this answer提示,它看上去很不錯,在大多數環境中管理資源。管理Scala中關閉資源的最佳方式是什麼?
雖然有一個上下文,乍一看,它似乎無法處理:將資源「切換」到另一個資源。這與I/O工作時經常出現:
for (fin <- managed(new FileInputStream(file));
// almost what we want, except see below
gzip <- managed(new GZIPInputStream(fin));
src <- managed(Source.fromInputStream(gzip))) {
/* some fancy code */
}
現在的問題是這樣的:如果成功創建gzip
,然後它負責關閉鰭和鰭不應該關閉(更新:這是不完全正確 - 雙密切的罰款;見接受的答案)。另一種選擇,雖然:
for (src <- managed(Source.fromInputStream(
new GZIPInputStream(new FileInputStream(file))))) {
/* some fancy code */
}
是不太正確的 - 如果在GZIPInputStream
構造函數(當然不可能)錯誤,FileInputStream
未關閉。同上fromInputStream
。
scala-arm(或其他軟件包)是否提供安全處理這個清理工具的工具,我還沒找到?
我不太清楚你的意思,特別是「讓知道源頭沒有任何東西提供」。我的問題不是在完成時關閉;即使我無法成功設置輸入鏈,也要確保文件已關閉。 – 2012-01-08 00:15:29
其實這個迭代器,枚舉器和枚舉在那裏,以解決(和其他)的情況。當源完成生產(你不關心的東西)和消費者完成時(如果實際上失敗了,它已經完成)。我要補充一個非常有用的帖子,將微啓你關於這個問題(這是** **你關注的解決方案) – 2012-01-08 00:25:42
謝謝 - 該職位確實有很大的幫助。它看起來像一個有趣的解決方案,儘管假設一切都是圍繞着Iteratees構建的。看起來不像它直接適用於使用Java的標準過濾流和閱讀器,但他們對Iteratees一無所知。 – 2012-01-08 01:03:08