当我多次执行外部命令时,我一直在努力尝试阻止IO。
我终于能够让它发挥作用(在阅读了很多页面之后,尝试了 不同的方法,其中许多导致阻止io)。
我目前的解决方案(如下)有效。但我必须使用输出(newArray)预定义byteArray,我必须给它一个大小。问题是, 当我给它一个固定的大小(比如1000)时,它只读取前1000个字节。 我的问题似乎是范围和我对数组不变性的不了解。有没有更清晰的方法将命令的输出读入一个尽可能多的增长的bytearray?
或者,有没有更好的方法将InputStream转换为byteArray newBytes?
bytes is a predefined byteArray
var newBytes = new Array[Byte](bytes.length);
def readJob(in: InputStream) {
newBytes = Stream.continually(in.read).takeWhile(_ != -1).map(_.toByte).toArray
in.close();
}
def writeJob(out: OutputStream) {
out.write(bytes)
out.close()
}
val io = new ProcessIO(
writeJob,
readJob,
_=> ())
val pb = Process(command)
val proc = pb.run(io)
val exitCode = proc.exitValue // very important, so it waits until it completes
非常感谢您提前寻求帮助
答案 0 :(得分:2)
我得到以下内容进行编译。
val newBytes = ArrayBuffer[Byte]()
def readJob(in: InputStream) {
newBytes.appendAll(Stream.continually(in.read).takeWhile(_ != -1).map(_.toByte).toArray)
in.close()
}
def writeJob(out: OutputStream) {
out.write(newBytes.toArray)
out.close()
}
// the rest of the code is unchanged
我不相信这是最好的方法,但它可能是可行的,只需对你已经拥有的东西进行微调。