4

我有一个方法save可以Iteratee it将一些数据保存到it. 在该方法内部,数据可用作生成字节数组块的枚举器。

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 期货)。

4

1 回答 1

1

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

Iteratee 不做任何资源管理(如关闭流);将东西推入 Iteratee 的生产者有这个责任。

之后,您可能会成功使用 Enumerator 中的“onDoneEnumerating”方法清理资源。

Scaladoc迭代

于 2014-01-11T23:30:22.873 回答