作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以 Play2.0 Enumeratee page显示了使用 &>
的示例或 through
更改 Enumerator[String]
的方法成Enumerator[Int]
:
val toInt: Enumeratee[String,Int] = Enumeratee.map[String]{ s => s.toInt }
val ints: Enumerator[Int] = strings &> toInt
Enumeratee.grouped
enumeratee 从单个元素创建块的枚举器。这似乎工作正常。
Array[Byte]
(由
Enumerator.fromFile
和
Enumerator.fromStream
返回)。考虑到这一点,我想把那些
Array[Byte]
输入并将它们转换为
Enumerator[String]
,例如每个字符串都是一行(以
'\n'
结尾)。线条和
Array[Byte]
的边界元素通常不会匹配。如何编写可以将分块数组转换为分块字符串的枚举器?
Array[Byte]
分块回浏览器。变得可用,并保留不属于完整行的剩余字节,直到下一个输入块出现。
iter: Iteratee[Array[Byte], T]
和一个
Enumerator[Array[Byte]]
会给我回一个
Enumerator[T]
,其中我的 T 元素由
iter
解析.
import play.api.libs.iteratee._
type AB = Array[Byte]
def takeWhile(pred: Byte => Boolean): Iteratee[AB, AB] = {
def step(e: Input[AB], acc: AB): Iteratee[AB, AB] = e match {
case Input.EOF => Done(acc, Input.EOF)
case Input.Empty => Cont(step(_, acc))
case Input.El(arr) =>
val (taking, rest) = arr.span(pred)
if (rest.length > 0) Done(acc ++ taking, Input.El(rest))
else Cont(step(_, acc ++ taking))
}
Cont(step(_, Array()))
}
val line = for {
bytes <- takeWhile(b => !(b == '\n' || b == '\r'))
_ <- takeWhile(b => b == '\n' || b == '\r')
} yield bytes
Ok.stream(Enumerator.fromFile(filename) &> chunkBy(line)).as("text/plain")
最佳答案
https://github.com/playframework/Play20/commit/f979006a7e2c1c08ca56ee0bae67b5463ee099c1#L3R131做一些类似于你正在做的事情。我修复了分组以处理剩余的输入。代码基本上如下所示:
val upToNewLine =
Traversable.splitOnceAt[String,Char](_ != '\n') &>>
Iteratee.consume()
Enumeratee.grouped(upToNewLine)
关于scala - 如何编写被枚举者沿不同边界对枚举器进行分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346592/
我是一名优秀的程序员,十分优秀!