基本上,我有一个程序,其输出转到stdout。我从我的Scala代码中运行该程序。我现在所做的是将输出重定向到文件。这样的事情。
val cmd = progName + " " + arguments
cmd #> new java.io.File(outputFilePath) !
我还要稍后处理该输出文件。这就是为什么这种方法很慢的原因,因为我必须先等待程序完成并将所有内容写入输出文件。我更喜欢的是让stdout的内容进行流式处理,以便从另一个线程中我可以在流式传输时读取内容。这样,我可以在运行Scala的程序时处理数据。
此外,输出文件中的数据由换行符分隔。有没有办法,我可以在程序运行时逐行获取数据。
最后,Java中有什么东西可以用来做Scala吗?
答案 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
))