写入处理标准输入

时间:2018-11-30 12:45:34

标签: scala

通过stdin库启动进程时,如何获得连接到stdout的某种可写流(以及连接到stderrscala.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")
  }

1 个答案:

答案 0 :(得分:2)

您有几个问题。

首先在代码段中,您永远不要将流程与io连接,也永远不要运行它。 可以这样完成:p run io

第二,withInputwithOutput 方法返回 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指出错误)