私はthis answerによってプロンプトされたscala-armライブラリを見ていて、ほとんどのコンテキストでリソースを管理するのに適しています。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(または他のパッケージ)は、このクリーンアップを安全に取り扱うための機能を提供していますが、まだ見つけられていませんか?
私はあなたが何を意味しているのか、特に "提供する "。私の問題は、私が終わったときに閉じることではなかった。それは私が入力チェーンをsucccessfully設定することができなかったとしても、ファイルが閉じられていることを確認することでした。 –
実際、このiteratee、enumeratorおよびenumerateeは、両方の(そしてその他の)ケースを解決するために存在します。ソースが生産を終了したとき(あなたが気にしないもの)とコンシューマーが完了したとき(そして実際に失敗したときに終了したとき)。私は非常に役に立つポストを追加するつもりです。それはその話題(**はあなたの懸念に対する解決策です**)にあなたを照らします。 –
ありがとう - そのポストは大いに役立ちます。興味深い解決策のように見えますが、すべてがIterateesの周りに構築されていることを前提としています。しかし、Javaの標準フィルタリングされたストリームとリーダーを使用することに直接適用されるようには見えませんが、Iterateesは何も知らないのです。 –