Scala 使用枚举器/Iteratee获取作为字符串的文件文本

Scala 使用枚举器/Iteratee获取作为字符串的文件文本,scala,stream,playframework-2.0,Scala,Stream,Playframework 2.0,查看Play Iteratee(以反应方式处理数据流),我有一个数组[Byte]枚举器(来自文件流),我需要获取该枚举器的字符串表示形式(我需要文本作为流的字符串) 我拥有的统计员样本是: Enumerator.fromFile(new File("test.txt")) 我可以通过折叠来解决它: val concat: Iteratee[Array[Byte], String] = Iteratee.fold[Array[Byte], String]("")((finalString,

查看Play Iteratee(以反应方式处理数据流),我有一个数组[Byte]枚举器(来自文件流),我需要获取该枚举器的字符串表示形式(我需要文本作为流的字符串)

我拥有的统计员样本是:

Enumerator.fromFile(new File("test.txt"))
我可以通过折叠来解决它:

val concat: Iteratee[Array[Byte], String] = 
  Iteratee.fold[Array[Byte], String]("")((finalString, array) => 
    finalString + new String(array.map(_.toChar)))

val textString = Await.result(
  Iteratee.flatten(fileEnumerator |>> concat).run, 1 seconds)

还有其他更简单的解决方案吗?

您可以使用
Iteratee.consume
。它将把所有输入连接成一个
数组[字节]
。然后可以转换为
字符串

val concat = Iteratee.consume[Array[Byte]]().map(x => new String(x))
只有在整个数组可用后,才有必要将其转换为字符串。单个字节无法映射到字符,因为许多字符的长度不是单个字节。

获取整个字符串的另一种方法是, 试玩游戏机 尽管如此,这还是有帮助的

Iteratee.flatten(
 fileEnumerator.map(chunk => new String(chunk)) |>> Iteratee.consume[String]()).run
 .onSuccess {case wholeUniverse => println(wholeUniverse)}
$ play console

scala> import play.api.libs.iteratee.{Enumerator, Iteratee}
import play.api.libs.iteratee.{Enumerator, Iteratee}

scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> import scala.concurrent.Future
import scala.concurrent.Future

scala> import java.io.File
import java.io.File

scala> val fileEnumerator = Enumerator.fromFile(new File("build.sbt"))
fileEnu: play.api.libs.iteratee.Enumerator[Array[Byte]] = play.api.libs.iteratee.Enumerator$$anon$4@650b0c9

scala> val future = Iteratee.flatten(fileEnumerator.map(x => new String(x)) |>> Iteratee.consume[String]()).run
future: scala.concurrent.Future[String] = scala.concurrent.impl.Promise$DefaultPromise@4134f577

scala> future.onSuccess {case x => println(x)}
import play.Project._

name := "shaharma-backend"

version := "1.0"

scalaVersion := "2.10.4"

playScalaSettings

resolvers += "Artima Maven Repository" at "http://repo.artima.com/releases"

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  "mysql" % "mysql-connector-java" % "5.1.36",
  "com.typesafe.slick" %% "slick" % "2.1.0",
  "com.typesafe.play" %% "play-slick" % "0.6.1"
)