如何在Scala中传输stdout?

时间:2016-06-28 13:52:34

标签: java scala apache-spark

基本上,我有一个程序,其输出转到stdout。我从我的Scala代码中运行该程序。我现在所做的是将输出重定向到文件。这样的事情。

val cmd = progName + " " + arguments 
cmd #> new java.io.File(outputFilePath) !

我还要稍后处理该输出文件。这就是为什么这种方法很慢的原因,因为我必须先等待程序完成并将所有内容写入输出文件。我更喜欢的是让stdout的内容进行流式处理,以便从另一个线程中我可以在流式传输时读取内容。这样,我可以在运行Scala的程序时处理数据。

此外,输出文件中的数据由换行符分隔。有没有办法,我可以在程序运行时逐行获取数据。

最后,Java中有什么东西可以用来做Scala吗?

1 个答案:

答案 0 :(得分:4)

ProcessBuilder有一个lineStream方法,我认为这正是你想要的。它返回Stream[String],使您可以在输出可用时处理输出。

这是一个简单的程序,测试速度慢,我保存为slow-printer.scala

// slow-printer.scala
for (i <- 1 to 10) {
  println(i)
  Thread.sleep(1000)
}

您可以从程序中流式传输输出(每秒1行),如下所示:

import scala.sys.process._

val lines = "scala slow-printer.scala".lineStream

lines foreach println

如果您遇到2.10,或者如果您的输出不是换行符,那么您可以使用ProcessIO来处理输出:

import scala.sys.process._

Seq("scala", "slow-printer.scala").run(new ProcessIO(
  _.close(), // stdin
  out => { // stdout
    val src = scala.io.Source.fromInputStream(out)
    for (line <- src.getLines()) {
      println(line)
    }
  },
  _.close() // stderr
))