1

我想使用scala.sys.process将图形的 DOT 描述发送到dot并检索到二进制图像的转换。

val process = "dot -T" + format
val inputStream = new ByteArrayInputStream(dot.getBytes("UTF-8"))
process #< inputStream !!

这可以正常工作,但!!返回 a String,而不是 a Array[Byte]。如何以字节而不是字符串获取响应?我认为我不能将字符串用作中间表示,因为二进制数据不会描述有效的字符串。

4

2 回答 2

1

如果您真的想避免文件 IO 并且您可以访问base64Linux(或等效)下的命令行程序,您可以

val process = Seq("bash","-c","dot -T" + format + " | base64")
val inputStream = new ByteArrayInputStream(dot.getBytes("UTF-8"))
javax.xml.bind.DatatypeConverter.parseBase64Binary(process #< inputStream !!)

得到一个字节数组。

您还可以提供自己的 ProcessIO,它在输入/输出流上使用二进制数据方法,但这需要更多的工作。不过,如果 base64 太慢,它可能是值得的。(我希望那个点本身会成为瓶颈,但我不确定你要发送什么。)

于 2013-04-12T15:38:29.643 回答
1

Scala Process IO 很简洁,但我总是发现很难弄清楚如何做我想做的事。希望这个例子对其他人有帮助。一旦我找到了正确的巫术,我想要的就很容易了。这是一个函数,它接受参数dot然后运行该过程,管道输入 anInputStream并管道输出 an OutputStream

  def dotbin(format: String)(dot: String): Array[Byte] = {
    val process = "dot -T" + format
    val bos = new ByteArrayOutputStream()
    val exitCode = process #< new ByteArrayInputStream(dot.getBytes) #> bos !< ProcessLogger(s => ())
    if (exitCode == 0) {
      bos.toByteArray()
    }
    else {
      throw new RuntimeException("Nonzero exit value (" + exitCode + ") for '" + process + "' with: " + dot)
    }
  }

一旦找到正确的符号,它就会变得简洁明了。请注意,2.10您不需要提供ProcessLoggerfor !<

于 2013-04-12T16:46:40.630 回答