假设我正在阅读一个InputStream
.
我通常会怎么做:
val inputStream = ...
try {
doStuff(inputStream)
} finally {
inputStream.close()
}
无论是否doStuff
抛出异常,我们都会关闭InputStream
.
我将如何使用迭代器:
val inputStream ...
Enumerator.fromStream(inputStream)(Iteratee.foreach(doStuff))
会InputStream
被关闭(即使doStuff
抛出异常)?
一个小测试:
val inputStream = new InputStream() { // returns 10, 9, ... 0, -1
private var i = 10
def read() = {
i = math.max(0, i) - 1
i
}
override def close() = println("closed") // looking for this
}
Enumerator.fromStream(inputStream)(Iteratee.foreach(a => 1 / 0)).onComplete(println)
我们只看到:
Failure(java.lang.ArithmeticException: / by zero)
溪流从未关闭。替换1 / 0
为1 / 1
,您会看到流关闭。
当然,我可以保持对原始流的引用并在失败时关闭它,但 AFAIK 使用 iteratees 的想法是创建可组合的迭代而不必这样做。
这是预期的行为吗?
有没有办法使用迭代器,以便始终正确处理资源?