我有一个方法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期货)。
Iteratee 的 scaladocs 说,处理资源是"生产者"而不是迭代者的责任:
Iteratee不做任何资源管理(例如关闭流);将内容推送到Iteratee的生产者有这个责任。
之后,您可能会成功使用枚举器中的"onDoneEnumerating"方法来清理资源。
Scaladoc Iteratee