0

こんにちは、Java アプリから dos バッチを実行する方法に関する多くのスレッドを見つけて、最終的に機能させました。しかし、私は次のことに行き詰まりました: そのコードを使用すると、プロセスが終了せず、アプリが動かなくなります。

p = Runtime.getRuntime().exec("ant.bat release",null,new File(".");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while (line != null) {
  line = reader.readLine();
  System.out.println("execTest: " + line);
}

p.waitFor() の前に読み取りを行うと、機能します。誰かが私にこれを説明できますか?

作業コード:

p = Runtime.getRuntime().exec("ant.bat release",null,new File(".");
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while (line != null) {
  line = reader.readLine();
  System.out.println("execTest: " + line);
}
p.waitFor();
4

2 に答える 2

0

cmdが実行され、cmdがstdストリームまたはエラーストリームに何かを出力した場合(uビューでは、入力ストリームです)、ストリームバッファから情報を読み取らない場合、waitforメソッドはcmdが実際に終了して戻るまでブロックするためです。バッファがいっぱいになり、cmdがまだ書き込む必要がある場合は、ストリームバッファからデータを読み取ってcmd書き込み用のスペースを提供するまでブロックします。

したがって、コードでは、コマンドが何も出力しない場合、入力ストリームを読み取らなくても結果を取得できます。コマンドがエラーストリームを出力する場合、エラーストリームを読み取らないため、結果を取得できません。

私のベストプラクティスは、waitfor メソッドを呼び出す前に、余分な 2 つのスレッドで std ストリームとエラー ストリームを別々に読み取ることです。

my cmd は、ランタイムで任意のコマンドを実行できることを意味します

于 2013-09-26T18:18:53.037 に答える