从进程的输出读取到byteArray

时间:2016-07-29 22:25:13

标签: scala io

当我多次执行外部命令时,我一直在努力尝试阻止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

非常感谢您提前寻求帮助

1 个答案:

答案 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

我不相信这是最好的方法,但它可能是可行的,只需对你已经拥有的东西进行微调。