通过stdin
库启动进程时,如何获得连接到stdout
的某种可写流(以及连接到stderr
和scala.sys.process
的可读流)?这是不起作用的代码(甚至不打印调试消息)
val p = Process("wc -l")
val io = BasicIO.standard(true)
val lines = Seq("a", "b", "c") mkString "\n"
val buf = lines.getBytes(StandardCharsets.UTF_8)
io withInput { w =>
println("Writing")
w.write(buf)
}
io withOutput { i =>
val s = new BufferedReader(new InputStreamReader(i)).readLine()
println(s"Output is $s")
}
答案 0 :(得分:2)
您有几个问题。
首先在代码段中,您永远不要将流程与io
连接,也永远不要运行它。
可以这样完成:p run io
。
第二,withInput
和withOutput
方法返回 NEW ProcessIO ,它们不会对实际变量进行突变,并且由于您不会将这些调用的返回值分配给变量,您什么都不做。
以下代码片段可以解决这两个问题,希望对您有用。
import scala.io.Source
import scala.sys.process._
import java.nio.charset.StandardCharsets
val p = Process("wc -l")
val io =
BasicIO.standard(true)
.withInput { w =>
val lines = Seq("a", "b", "c").mkString("", "\n", "\n")
val buf = lines.getBytes(StandardCharsets.UTF_8)
println("Writing")
w.write(buf)
w.close()
}
.withOutput { i =>
val s = Source.fromInputStream(i)
println(s"Output is ${s.getLines.mkString(",")}")
i.close()
}
p run io
毫无疑问地要求澄清。
PS::它打印"Output is 3"
-(感谢Dima指出错误)。