订阅Akka流,读取文件

时间:2019-06-25 13:28:04

标签: scala akka akka-stream

我正在尝试使用Akka Streams在Scala中读取文件,我想将结果放入列表中。我尝试了以下代码,该列表在接收器中增加了新值,但在接收器之外却得到了一个空列表。

def readStream (path : String, date : String) : List[Array[String]] = {
  var lines: List[scala.Array[String]] = List[scala.Array[String]]()

  implicit val system = ActorSystem("Sys")
  val settings = ActorMaterializerSettings(system)
  implicit val materializer = ActorMaterializer(settings)

  val sink: Sink[String, Future[Done]] = Sink.foreach((x : String) => {
    val list : List[scala.Array[String]] = List(x.split("|"))
    lines = lines ++ list
    // println(lines.length)
  })

  val result: Unit = FileIO.fromPath(Paths.get(path + "transactions_" + date + ".data"))
    .via(Framing.delimiter(ByteString("\n"), 256, true).map(_.utf8String))
    .to(sink)
    .run()
  lines
}

1 个答案:

答案 0 :(得分:3)

三件事:(1)将actor系统和实现器传递给您的方法(显式或作为隐式参数),而不是在方法内部创建它们;(2)使用Sink.seq,以及(3)使用{{ 1}}和toMat以获得Keep.right的物化值(Sink保留to的物化值):

Source

或者,使用val result: Future[Seq[String]] = FileIO.fromPath(...) .via(Framing.delimiter(ByteString("\n"), 256, true)) .map(_.utf8String) .toMat(Sink.seq)(Keep.right) .run() toMat的简写是Keep.right

runWith