我正在查看由这个答案提示的scala-arm库,它看起来非常适合在大多数情况下管理资源。
但是,有一个上下文,乍一看似乎无法处理:将资源“移交”给另一个资源。这在使用 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(或其他一些包)是否提供了一种我还没有找到的安全处理这种清理的工具?