2013-04-12 23 views
1

我想用scala.sys.process發送一個圖表的DOT描述到dot並檢索轉換爲二進制圖像。如何使用ProcessBuilder返回二進制數據?

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

這會工作得很好,但!!返回String,而不是一個Array[Byte]。我怎樣才能得到字節而不是字符串的響應?我不認爲我可以使用字符串作爲中間表示,因爲二進制數據不會描述有效的字符串。

+0

將點寫入文件並從Scala讀取該文件? –

+0

這會工作,但我希望有一種方法可以避免文件io。或者我在這裏忽略了一些複雜因素? – schmmd

回答

1

Scala進程IO很整潔,但我總是很難找出如何去做我想做的事情。希望這個例子對別人有幫助。一旦我找到正確的巫術,我想要的東西很容易。這是一個函數,它將參數設置爲dot,然後運行該過程,在InputStream中管道系統和管道輸出OutputStream

​​

一旦找到正確的符號,它就變得乾淨簡潔。請注意,在2.10中,您不需要爲!<提供ProcessLogger

1

如果你真的想避免文件IO,你必須訪問Linux下的base64命令行程序(或等同的),你可以

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太慢,它可能是值得的。 (我預計這個點本身就是瓶頸,但我不確定你發送的是什麼)。

相關問題