私はこの答えによって促されたscala-armライブラリを見ています、そしてそれはほとんどの文脈でリソースを管理するのに素晴らしいように見えます。
ただし、一見したところ、処理されていないように見えるコンテキストが1つあります。それは、リソースを別のリソースに「渡す」というコンテキストです。これは、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
が正常に作成された場合、 finを閉じる必要があり、finを閉じないでください(更新:これは正しくありません-二重閉じるのは問題ありません。受け入れられた回答を参照してください)。ただし、代替案:
for (src <- managed(Source.fromInputStream(
new GZIPInputStream(new FileInputStream(file))))) {
/* some fancy code */
}
完全に正しくありません-GZIPInputStream
コンストラクターに(明らかにありそうもない)エラーがある場合、FileInputStream
は閉じられません。同上fromInputStream
。
scala-arm(または他のパッケージ)は、私がまだ見つけていないこのクリーンアップを安全に処理するための機能を提供しますか?