2016-07-29 7 views
0

私は、外部コマンドを何度も実行したときにIOをブロックしようとするのに少し苦労しました。プロセスの出力からbyteArrayへの読み込み

私はようやく(多くのページを読んで、 異なるメソッドを試して、それらの多くがioをブロックしてしまった)動作させることができました。

私の現在の解決策(下記)が動作します。しかし、私は出力(newArray)でbyteArrayを事前定義しなければならず、サイズを指定する必要があります。問題は、 私はそれに固定サイズ(例えば1000)を与えると、それは最初の1000バイトだけを読み込みます。 私の問題は、配列の不変性のスコープと私の貧弱な理解のようです。コマンドの出力を、必要に応じて大きくなるbytearrayに読み込むためのクリーンな方法はありますか?

または、InputStreamをbyteArray newBytesに変換するより良い方法はありますか?任意のヘルプ

答えて

2

を事前に非常に多くの

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 

おかげで、あなたは私がコンパイルするには、以下のです。

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

関連する問題