首页 > 解决方案 > 写入处理标准输入

问题描述

通过库启动进程时,如何获得某种连接到(以及连接到和的stdin可读流)的可写流?这是不起作用的代码(甚至不打印调试消息)stdoutstderrscala.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")
  }

标签: scala

解决方案


你有几个问题。

首先在你的代码片段中,你永远不会将你的进程与它连接起来,io也永远不会运行它。可以这样做:p run io.

其次,withInput&withOutput 方法返回一个新的 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 指出错误)


推荐阅读