我正在尝试使用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
}
答案 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