2016-07-29 8 views
0

Ich habe ein wenig gekämpft, um zu versuchen, IO zu blockieren, wenn ich einen externen Befehl viele verschiedene Male ausführe.Lesen von der Ausgabe eines Prozesses in ein ByteArray

Ich war endlich in der Lage, es zum Laufen zu bringen (nach dem Lesen vieler Seiten, versuchen verschiedene Methoden, von denen viele zu Blockierung io).

Meine aktuelle Lösung (unten) funktioniert. Aber ich muss das ByteArray mit der Ausgabe (newArray) vordefinieren und ich muss ihm eine Größe geben. Das Problem ist, wenn ich es eine feste Größe geben (sagen wir 1000), liest es nur die ersten 1000 Bytes. Mein Problem scheint zu scoping und mein schlechtes Verständnis der Unveränderlichkeit von Arrays. Gibt es eine sauberere Möglichkeit, die Ausgabe des Befehls in ein Bytearray zu lesen, das so stark wie nötig wächst?

Oder gibt es eine bessere Möglichkeit, den InputStream in ein byteArray newBytes zu konvertieren?

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 

Dank Sie sehr viel im Voraus für jede Hilfe

Antwort

2

Ich habe das kompilieren folgendes.

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 

Ich bin nicht überzeugt, dass dies der beste Ansatz ist, aber es könnte mit minimalen Anpassungen bearbeitbar sein, was du schon hast.

+0

Danke. Genau das habe ich gebraucht – dmg