如何从文本文件创建Akka Source [String]?

时间:2016-07-14 19:50:04

标签: scala akka-stream

这似乎是世界上最简单的事情,但我刚刚开始并且我受到了阻碍,所以请耐心等待。

FileIO对象提供fromFile函数,毫不奇怪地返回Source[ByteString, Future[IOResult]]

但我有一个UTF编码的文本文件,我想要一个Source[String, Future[IOResult]] - 也就是常规字符串的源,带有unicode字符,而不是字符串的废话。

这是一个Hello,世界级的例子,但我被困了。

scala.io.Source fromFile正是我需要的akka.stream.scaladsl.Source与{{1}}之间的名称冲突是什么,所以如果有人能向我解释,我很感激。)

2 个答案:

答案 0 :(得分:1)

您可以使用ByteString中的decodeString功能解码为UTF-x:

decodeString(charset: String): String

或者更常见的是,对于UTF-8:

utf8String: String

所以,基本上:

val path = Paths.get("/tmp/example.txt")
FileIO.fromPath(path)
  .via(Framing.delimiter(ByteString(System.lineSeparator), maximumFrameLength=8192, allowTruncation=true))
  .map(_.utf8String)

请注意,FileIO.fromFile现已弃用。

答案 1 :(得分:1)

import akka.NotUsed

import scala.io.{Source => fileSource}
import akka.stream.scaladsl.{Source => strmSource}

val it = fileSource.fromFile("/home/expert/myfile.txt").getLines()
val source : strmSource[String, NotUsed] = strmSource.fromIterator(() => it)
  .map { line =>
    line.reverse
  }

整个事情被懒惰地评估,因此100GB不会立刻读取。