我有一个myfile.jar
文件,我正在使用ProcessBuilder通过另一个Java程序执行,并尝试使用InputStream读取jar的控制台输出,如下所示:
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "myfile.jar", "arg1");
Process p = pb.start();
InputStream in = p.getInputStream();
InputStreamReader ins = new InputStreamReader(in);
BufferedReader br = new BufferedReader(ins);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
p.destroy();
当我执行上面的代码时,我没有在控制台上打印任何内容。 myfile.jar
不是我自己开发的。但是当我阅读myfile.jar
的代码时,它使用Logger
使用ConsoleHandler
在控制台上打印。我认为这可能是个问题。
编辑:在控制台上独立执行java -jar myfile.jar arg1
时,它会在控制台上打印输出。
这让我疯狂了3天。解决这个问题的方向将有助于我了解更多信息。
答案 0 :(得分:1)
处理外部进程时,不仅要使用/监视stdout,还应该使用stderr。
您可以使用第二个读取器从流程中读取stderr流,但通常使用ProcessBuilder#redirectErrorStream
更容易组合流,这会将stderr重定向到流程InputStream
。
有时进程会输出到stderr而不是stdout。
即使你没有使用这些流的输出,读取它们总是一个好主意,因为如果没有刷新流,某些进程可能会停止。