【问题标题】:Get a File text as a String using Enumerator/Iteratee使用 Enumerator/Iteratee 将文件文本作为字符串获取
【发布时间】:2014-08-03 02:19:14
【问题描述】:

查看 Play Iteratee(响应式处理数据流),我有一个 Array[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)

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

【问题讨论】:

    标签: scala stream playframework-2.0


    【解决方案1】:

    您可以使用Iteratee.consume。它将所有输入连接到一个Array[Byte]。然后您可以转换为String

    val concat = Iteratee.consume[Array[Byte]]().map(x => new String(x))
    

    只有在整个数组可用后才需要转换为字符串。单个字节不能映射到字符,因为许多字符的长度不是单个字节。

    【讨论】:

      【解决方案2】:

      获取整个字符串的另一种方法是,

      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"
      )
      

      I myself learned something 所以虽然会有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 2011-02-03
        • 2017-12-02
        • 1970-01-01
        • 2014-08-30
        • 2021-08-03
        相关资源
        最近更新 更多