scala - 写入处理标准输入
问题描述
通过库启动进程时,如何获得某种连接到(以及连接到和的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")
}
解决方案
你有几个问题。
首先在你的代码片段中,你永远不会将你的进程与它连接起来,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 指出错误)。
推荐阅读
- java - org.apache.coyote.http11.Http11Processor - 迁移到 jdk11 后完成响应时出错
- r - R:knn + pca,选择了未定义的列
- sql - 如何在 Oracle 中忽略字符串末尾的 Null 值?
- python - 检索每组具有 n 个最旧和 n 个最新日期的行
- prestashop - Prestashop 1.7 上的 DisplayCarrierList Hook 替代方案
- wso2 - 无法生成 P2 元数据:WSO2 产品-ei 安装中的 P2 发布者返回代码为 13
- python - 无法在 Flask 中使用 FormData() 和 jQuery 处理文件上传
- tableau-api - 在计算字段中获取活动的多个过滤器
- delphi - 为什么源文件创建时间戳会在保存时更新?
- java - word文档无法调整图片大小