Scala 使用Akka流读取大文件

Scala 使用Akka流读取大文件,scala,akka-stream,Scala,Akka Stream,我正在尝试Akka Streams,这里有一个简短的片段: override def main(args: Array[String]) { val filePath = "/Users/joe/Softwares/data/FoodFacts.csv"//args(0) val file = new File(filePath) println(file.getAbsolutePath) // read 1MB of file as a stream

我正在尝试Akka Streams,这里有一个简短的片段:

  override def main(args: Array[String]) {
    val filePath = "/Users/joe/Softwares/data/FoodFacts.csv"//args(0)

    val file = new File(filePath)
    println(file.getAbsolutePath)
    // read 1MB of file as a stream
    val fileSource = SynchronousFileSource(file, 1 * 1024 * 1024)
    val shaFlow = fileSource.map(chunk => {
      println(s"the string obtained is ${chunk.toString}")
    })
    shaFlow.to(Sink.foreach(println(_))).run // fails with a null pointer

    def sha256(s: String) = {
      val  messageDigest = MessageDigest.getInstance("SHA-256")
      messageDigest.digest(s.getBytes("UTF-8"))
    }
  }
当我运行此代码段时,我得到:

Exception in thread "main" java.lang.NullPointerException
    at akka.stream.scaladsl.RunnableGraph.run(Flow.scala:365)
    at com.test.api.consumer.DataScienceBoot$.main(DataScienceBoot.scala:30)
    at com.test.api.consumer.DataScienceBoot.main(DataScienceBoot.scala)
在我看来,文件源不是空的吗?为什么会这样?有什么想法吗?FoodFacts.csv的大小为40MB,而我要做的就是创建1MB的数据流


即使使用defaultChunkSize 8192也不起作用

1.0
已被弃用。如果可以,请使用
2.x

当我使用
FileIO.fromFile(file)
而不是
SynchronousFileSource
尝试使用
2.0.1
版本时,这是一个编译失败,消息为
失败,指针为null
。这仅仅是因为它的作用域中没有
actormatarializer
。包括它,使它工作:

object TImpl extends App {
import java.io.File

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

  val file = new File("somefile.csv")
  val fileSource = FileIO.fromFile(file,1 * 1024 * 1024 )
  val shaFlow: Source[String, Future[Long]] = fileSource.map(chunk => {
    s"the string obtained is ${chunk.toString()}"
  })

  shaFlow.runForeach(println(_))    
}

这适用于任何大小的文件。有关dispatcher配置的更多信息,请参阅。

您使用的是什么版本的akka streams?我认为SynchronousFileSource现在不推荐使用1.0。我应该使用哪一个来读取一个巨大的文件,并将块作为流传递?有什么线索吗?