2

私は/usr/bin/perl -e 'for(my $i=0;$i<1000;$i++){print 1x1000;print STDERR 2x1000;}'自分のプログラムで(ターミナルで動作する)実行しようとしています。

ProcessBuilder pb = new ProcessBuilder(go); //go is the command
process = pb.start();
BufferedReader incommandbuf = new BufferedReader(new InputStreamReader(process.getInputStream()),1024*1000);
BufferedReader errcommandbuf = new BufferedReader(new InputStreamReader(process.getErrorStream()),1024*1000);
stdString = "";

while ((line = incommandbuf.readLine()) != null)
{
    stdString += line + "\n";
}
String errorstrtemp = "";
while ((line = errcommandbuf.readLine()) != null)
{
    errorstrtemp += line + "\n";
}

これを実行しようとすると、ハングしwhile ((line = incommandbuf.readLine()) != null)ます。コマンドをに変更すると、プログラムが実行され/usr/bin/perl -e 'for(my $i=0;$i<64;$i++){print 1x1000;print STDERR 2x1000;}'ます。65以上になると、機能しません。最初は、BufferedReadersのサイズを変更するだけだと思っていましたが、役に立ちませんでした。これを引き起こしているものについての手がかりはありますか?必要に応じて追加情報を提供します。ありがとう。

4

1 に答える 1

5

一度に1つのストリームを読んでいます。他のストリームがバッファをいっぱいにすると、プロセスはあなたがそれを読み取るのを待つのをやめます。解決策は、異なるスレッドでストリームを読み取るか、ProcessBuilder.redirectErrorStreamを使用することです。

于 2012-11-08T15:59:52.850 に答える