scala - 写入处理标准输入

标签 scala

如何将某种可写流连接到 stdin (以及连接到 stdoutstderr 的可读流)通过 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")
  }

最佳答案

你有几个问题。

首先在您的代码段中,您永远不会将您的流程与 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 指出错误)。

关于scala - 写入处理标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53557874/

相关文章:

scala - 如果 M 是一个 monad,如何正确地将 List[M[List[A]]] 组合到 M[List[A]] 中?

scala - 使用 Spark DStream 作为 Akka 流的源的惯用方式

scala - 按索引过滤列表

scala - 运行 Play 应用程序的 SBT 在开始使用 scala.sys.process.run 时立即退出?

scala - Scala 可以在参数中允许自由类型参数吗(Scala 类型参数是一等公民吗?)?

java - SBT:如何将类的实例打包为 JAR?

java - 无法使用 AspectJWeaver 启动 Spray

scala - 光滑:创建数据库

斯卡拉/Play : how to write JSON result from async db call to http Ok

scala - 理解 forall 并存在空列表上的输出