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 (Scala フューチャーを使用)の Play Framework Iteratee ライブラリを使用しています。

4

1 に答える 1

1

Iteratee の scaladocs は、リソースを処理するのは iteratee ではなく「プロデューサー」の責任であると述べています。

Iteratee は、リソース管理 (ストリームのクローズなど) を行いません。Iteratee に何かをプッシュするプロデューサーには、その責任があります。

Enumerator で「onDoneEnumrating」メソッドを使用して、後でリソースをクリーンアップすることに成功する場合があります。

Scaladoc Iteratee

于 2014-01-11T23:30:22.873 に答える