由于Scala有很多很酷的东西,我认为它可能有一些东西可以让捕获流程的输出变得容易。我知道Java的做法,但我想要另一种方式。
答案 0 :(得分:5)
scala> scala.tools.nsc.io.Process("ls -1 /tmp | wc").stdout foreach println
41 63 770
或者有一个repl命令:
scala> :sh cat /etc/passwd | wc
stdout: List[String] = List( 65 185 3667)
使用2.8发送任何IO代码将需要克服比我能够击败的更多停止能量,所以我把它全部放在编译器中。 scala.tools.nsc.io中有很多相当有用的东西。
答案 1 :(得分:5)
从Scala 2.9开始,你可以这样做:
import scala.sys.process.Process
println(Process("uname -a").!!.contains("x86_64"))
答案 2 :(得分:3)
即使说Java这样做也不太正确,因为在不同的操作系统上处理/流处理不同,大部分功能实际上都传递给本机代码。
一个更有趣的问题是询问Scala是否有任何方法可以更加“惯用”地与读者和作者(或者如果你使用NIO功能包装你的流的渠道)
答案是什么?
目前scala IO库正在进行基于2.8的工作,这几乎肯定会包含一种更好的方式来处理流和通道,但目前还没有。
在处理exec()进程时,您可能还会发现actor更好地处理使用一个线程进行输入和一个线程进行输出的常见做法。