我有一个方法save,它采用Iteratee it并将某些数据保存到it。在方法内部,数据可以作为enumerator生成字节数组块。

def save[E](consumer: Iteratee[Array[Byte], E]): Future[E] = {
  val producer: Enumerator[Array[Byte]] = // ...
  Iteratee.flatten(producer(consumer)).run
}


想要的:调用save,以使其将数据写入FileOutputStream

我尝试了以下方法,但不确定是否要这样做:

def writeToStream(s: OutputStream) =
  Iteratee.foreach((e: Array[Byte]) => s.write(e)).
    mapDone(r => { s.close(); r })
save(writeToStream(new FileOutputStream(myFile)))


问题:这是应该完成的方式吗?我担心这不会总是关闭流(例外情况)。

我正在使用Play Framework 2.1中的Play Framework Iteratee库(使用Scala期货)。

最佳答案

Iteratee的scaladocs表示,“生产者”负责处理资源,而不是iteratee的责任:


Iteratee不执行任何资源管理(例如关闭流);生产者将物品推入Iteratee负有责任。


之后,在枚举器中使用“ onDoneEnumerating”方法可能会成功清理资源。

Scaladoc Iteratee

10-05 20:10