Scala迭代器写入文件

4
我有一个名为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的迭代器库(它使用Scala futures)。

1个回答

1
迭代器(Iteratee)的scaladoc说,处理资源的责任在“生产者”而不是迭代器身上:

迭代器不会进行任何资源管理(例如关闭流),将内容推送到迭代器中的生产者有此责任。

您可以尝试使用Enumerator中的“onDoneEnumerating”方法来清理资源。

Scaladoc 迭代器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接