2012-01-05 140 views
0

我看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(或其他軟件包)是否提供安全處理這個清理工具的工具,我還沒找到?

回答

3

做了找了幾分鐘,發現它其實並不重要。 java.io.Closeable規定,close()荷蘭國際集團已關閉的資源是一個空操作。因此,將所有內容都包裝在managed中並讓其雙關閉是安全的。因此,第一個代碼示例是正確的。

1

對我來說,最好的方法是使用迭代器,枚舉器和枚舉器的概念,它在功能世界中具有基礎。

您可能感興趣的是具有非常好實現的Scalaz庫。

有人說這些概念是爲了讓源頭上的迭代器知道消費者何時結束消費而且還有其他方式。知道源的缺點沒有什麼可提供的。

編輯

這裏是什麼iteratee是一個非常明確的post。看到關於你的問題的動機參數......關閉資源,無論什麼時候做得好或錯誤,但在正確的時間

+0

我不太清楚你的意思,特別是「讓知道源頭沒有任何東西提供」。我的問題不是在完成時關閉;即使我無法成功設置輸入鏈,也要確保文件已關閉。 – 2012-01-08 00:15:29

+0

其實這個迭代器,枚舉器和枚舉在那裏,以解決(和其他)的情況。當源完成生產(你不關心的東西)和消費者完成時(如果實際上失敗了,它已經完成)。我要補充一個非常有用的帖子,將微啓你關於這個問題(這是** **你關注的解決方案) – 2012-01-08 00:25:42

+0

謝謝 - 該職位確實有很大的幫助。它看起來像一個有趣的解決方案,儘管假設一切都是圍繞着Iteratees構建的。看起來不像它直接適用於使用Java的標準過濾流和閱讀器,但他們對Iteratees一無所知。 – 2012-01-08 01:03:08

相關問題