4

Processクラスを使用してプロセスを実行しています。プロセスを正常に実行するには、エラーストリームを確認する必要があるようです。プロセスを正しく実行するために必要なエラーストリームを通過するのはなぜですか?私が間違っていることはありますか?

Process wkstdin = Runtime.getRuntime().exec(command);
BufferedWriter wkstdin_writer = new BufferedWriter(
            new OutputStreamWriter(wkstdin.getOutputStream()));
//write data

コードの必要な部分:

BufferedReader input = new BufferedReader(new InputStreamReader(
            wkstdin.getErrorStream()));
String ch;
while ((ch = input.readLine()) != null)
{
  System.out.println(ch);
}
4

2 に答える 2

6

プロセスがstderrに書き込むと、出力は固定サイズのバッファーに送られます。バッファがいっぱいになると、バッファに残りの出力用のスペースができるまで、プロセスはブロックされます。したがって、バッファが空にならない場合、プロセスはハングします。

また、知りたいプロセスで問題が発生した場合、エラーストリームに実際に役立つ情報が含まれている可能性があります。

いくつかの提案:

  • chは通常charに使用されるため、文字列chに名前を付けると誤解を招くように思われます。
  • stderrから読み取るコードを専用のワーカースレッドに配置するのが好きです。そうすれば、入力ストリームの読み取りとエラーストリームの読み取りの切り替えが、許可しなくても自動的に行われます。
于 2012-06-11T14:28:23.547 に答える
2

これは、実行しているターゲットプロセスによって異なります。

多くの場合、ターゲットプロセスは、ストリームが消費されるまでブロックします(ターゲットプロセスのストリームバッファーを排出する必要があります)。したがって、エラー/出力ストリームを処理していない場合、ストリームがドレインされるためにターゲットプロセスがブロックされているため、ターゲットプロセスがハングしているように見える場合があります。

于 2012-06-11T14:24:38.167 に答える