gpt4 book ai didi

Scala:读取 Enumerator[T] 的一些数据并返回剩余的 Enumerator[T]

转载 作者:行者123 更新时间:2023-12-01 16:53:38 25 4
gpt4 key购买 nike

我正在使用 playframework 的异步 I/O 库,它使用 Iteratees 和 Enumerators。我现在有一个 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)
}

但我不知道该怎么做。如何从枚举器读取一些字节并获取剩余的枚举器?

用OutputStream替换Iteratee[Byte],用InputStream替换Enumerator[Byte],这将非常容易:

def write(value: Byte, output: OutputStream) = {
output.write(value)
output
}
def read(input: InputStream) = (input.read,input)

但是我需要play框架的异步I/O。

最佳答案

我想知道你是否可以从另一个角度来实现你的目标。

那个使用剩余枚举器的函数,我们称之为remaining,大概它适用于迭代器来处理剩余部分:remaining |>> iteratee产生另一个 iteratee。我们将生成的 iteratee 称为 iteratee2...您能否检查是否可以获得对 iteratee2 的引用?如果是这种情况,那么您可以使用第一个 iteratee head 获取并处理第一个字节,然后通过 flatMap 将 headiteratee2 结合起来:

val head = Enumeratee.take[Byte](1) &>> Iteratee.foreach[Byte](println)
val processing = for { h <- head; i <- iteratee2 } yield (h, i)
Iteratee.flatten(processing).run

如果您无法获取 iteratee2 - 如果您的枚举器与您未实现的枚举器组合,就会出现这种情况 - 那么此方法将不起作用。

关于Scala:读取 Enumerator[T] 的一些数据并返回剩余的 Enumerator[T],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10950267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com