Iteratees と Enumerator を使用する playframework の非同期 I/O ライブラリを使用しています。これで、データ シンクとして Iterator[T] が作成されました (簡単にするために、内容をファイルに格納する Iterator[Byte] とします)。この Iterator[Byte] は、書き込みを処理する関数に渡されます。
しかし、書き込みの前に、ファイルの先頭にいくつかの統計情報を追加したいので (簡単にするために 1 バイトとします)、書き込み関数に渡す前に次の方法でイテレータを転送します。
def write(value: Byte, output: Iteratee[Byte]): Iteratee[Byte] =
Iteratee.flatten(output.feed(Input.El(value)))
保存されたファイルをディスクから読み取ると、そのファイルの Enumerator[Byte] が取得されます。最初に、追加のデータを読み取って削除し、残りの Enumerator[Byte] を読み取りを処理する関数に渡したいと考えています。したがって、列挙子も変換する必要があります。
def read(input: Enumerator[Byte]): (Byte, Enumerator[Byte]) = {
val firstEnumeratorEntry = ...
val remainingEnumerator = ...
(firstEnumeratorEntry, remainingEnumerator)
}
しかし、これを行う方法がわかりません。Enumerator からいくつかのバイトを読み取り、残りの Enumerator を取得するにはどうすればよいですか?
Iteratee[Byte] を OutputStream に、Enumerator[Byte] を InputStream に置き換えると、これは非常に簡単になります。
def write(value: Byte, output: OutputStream) = {
output.write(value)
output
}
def read(input: InputStream) = (input.read,input)
しかし、play フレームワークの非同期 I/O が必要です。