我正在使用使用 Iteratees 和 Enumerators 的 playframework 的异步 I/O 库。我现在有一个 Iterator[T] 作为数据接收器(为简单起见,它是一个将其内容存储到文件中的 Iterator[Byte])。这个 Iterator[Byte] 被传递给处理写入的函数。
但是在写之前我想在文件开始处添加一些统计信息(为了简化说它是一个字节),所以在将迭代器传递给写函数之前,我以以下方式传输迭代器:
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)
}
但我不知道如何做到这一点。如何从枚举器中读取一些字节并获取剩余的枚举器?
将 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。