1

Java アプリから起動したプロセスの出力をリダイレクトするために、次のコードを使用します。

ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.redirectOutput(Redirect.INHERIT);
builder.redirectErrorStream(true);

これで、Eclipse からコードを実行すると問題なく動作します。Eclipse のコンソールで出力を確認できます。
しかし、jar ファイルを作成して cmd ウィンドウから実行すると、たとえばjava -jar MyJar.jar、プロセスの出力が出力されません。この理由は何でしょうか?

4

2 に答える 2

2

私は答えが遅れていることを知っていますが、答えに出くわす前にこの質問に出くわし、同じ船に乗っている他の誰かを検索して救いたいと思っていました.

これは、実際には Windows の既知のバグです: https://bugs.openjdk.java.net/browse/JDK-8023130

ストリームを自分でリダイレクトすることで回避できます。

Process p = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
   System.out.println(line);
}

p.waitFor();

br.close();
于 2014-02-11T23:15:22.207 に答える
0

そのプロセスが何らかの理由でエラーを出力して終了している可能性があります。したがって、実際の出力は Out ストリームではなく Err ストリームに入ります。コードはアウト ストリームのみをリダイレクトするため、重要なプロセス エラー情報が失われる可能性があります。このコードを使用して、Out ストリームと Err ストリームの両方を継承することをお勧めします。

ProcessBuilder builder = new ProcessBuilder("MyProcess.exe");
builder.inheritIO();

両方のストリームをリダイレクトするもう 1 つの理由は、子プロセスの出力バッファリングに関連しています。親プロセス (Java アプリケーション) が子プロセスの標準ストリーム (Out および Err) を読み取ったりリダイレクトしたりしていない場合、子プロセスはしばらくするとブロックされ、それ以上進行できなくなります。

とにかく、出力にエラーが発生する可能性があることは間違いありません。

于 2013-10-31T16:28:25.930 に答える