执行JAR并使用InputStream读取控制台输出 - Java

时间:2014-12-29 05:55:26

标签: java logging inputstream

我有一个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天。解决这个问题的方向将有助于我了解更多信息。

1 个答案:

答案 0 :(得分:1)

处理外部进程时,不仅要使用/监视stdout,还应该使用stderr。

您可以使用第二个读取器从流程中读取stderr流,但通常使用ProcessBuilder#redirectErrorStream更容易组合流,这会将stderr重定向到流程InputStream

有时进程会输出到stderr而不是stdout。

即使你没有使用这些流的输出,读取它们总是一个好主意,因为如果没有刷新流,某些进程可能会停止。