【问题标题】:Unable to read files by using akka stream无法使用 akka 流读取文件
【发布时间】:2017-12-08 16:48:46
【问题描述】:

我们正在尝试从 akka 流中读取文件。文件包含日志,应用程序很容易将日志写入新文件。但是,当运行我们的程序时,我们得到了意想不到的输出。我们的代码如下:

class LogsAkkaStream {

  implicit val system = ActorSystem("AkkaStreams")
  implicit val ec = system.dispatcher
  implicit val materializer = ActorMaterializer()

  val source: Source[ByteString, Future[IOResult]] = FileIO.fromPath(Paths.get("/home/harmeet/workspace/mylogs.logs"))
  val sink: Sink[ByteString, Future[IOResult]] = FileIO.toPath(Paths.get("."), Set(CREATE, WRITE, APPEND))
  val runnableGraph: RunnableGraph[Future[IOResult]] = source.to(sink)

  runnableGraph.run().foreach { result =>
    println(s"${result.status}, ${result.count} bytes read. ")
  }
}

object LogsAkkaStream extends App {
  new LogsAkkaStream
}

mylogs.logs 包含 1000 行记录,但该程序的 output 是:Success(Done), 0 bytes read. 仍然,我们没有得到实际的程序。

【问题讨论】:

    标签: java scala akka actor akka-stream


    【解决方案1】:

    当我输入文件的已知工作路径时,它可以在我的 REPL 中工作。

    您需要确保源文件的路径正确,并且您需要将正确的目标路径放入文件

    另外,您需要使用toMat 而不是to,这样您就可以获得读取操作和写入操作的IOResult。 (我建议您使用_ zip _,这样您就可以得到Future[(IOResult, IOResult)])。

    【讨论】:

    • 嘿@Viktor 文件在正确的路径上,但我不确定,会发生什么?
    • @harmeet-singh-taara 检查您的目标路径 - “.”不好,请改用文件名。
    • @Viktor,我们将代码更改为FileIO.toPath(Paths.get("home/harmeet/logs.log"), Set(CREATE, WRITE, APPEND)),但仍然出现相同的输出。
    • 您需要验证源路径和目标路径。 “home/harmeet/logs.log”是相对的。确保使用规范路径。
    • 感谢@ViktorKlang,这是有效的,这意味着current-directory(.) 路径在Paths.get(".") 中不起作用。
    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多