2016-07-29 62 views
0

当我在许多不同的时间执行一个外部命令时,我一直在努力试图阻止IO。从一个进程的输出读取字节数组

我终于能够得到它的工作(阅读很多页面后,尝试 不同的方法,其中许多导致阻止io)。

我目前的解决方案(如下)工作。但是我必须预先定义byteArray和输出(newArray),我必须给它一个大小。问题是, 当我给它一个固定的大小(比如1000)时,它只读取前1000个字节。 我的问题似乎是范围和我对数组不变性的理解。有没有更清晰的方法来读取命令的输出成为一个增长尽可能多的字节数组?

或者,有没有更好的方法来将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 

谢谢你提前很多的任何帮助

回答

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 

我不相信这是最好的方法,但它可能适用于对已有的最小调整。

+0

谢谢。这正是我需要的 – dmg