设置超时值时如何获取进程的输出?
我目前正在使用 Apache Commons IO utils 从进程的标准输出和错误输出创建字符串。
下面的代码(带注释)适用于终止的进程。但是,如果进程不终止,主线程也不会终止!
如果我取消注释掉注释掉的代码并注释掉process.waitfor()
,该方法将正确销毁非终止进程。但是,对于终止进程,无法正确获得输出。看来有一次waitFor
完成后,我无法获取进程的输入和错误流?
最后,如果我尝试将评论部分移至何处process.waitFor()
目前是,删除process.waitFor()
并取消注释部分,那么对于非终止进程,主线程也不会停止。这是因为process.waitFor(15, ...)
永远不会达到。
private static Outputs runProcess(String command) throws Exception {
Process process = Runtime.getRuntime().exec(command);
// if (!process.waitFor(15, TimeUnit.SECONDS)) {
// System.out.println("Destroy");
// process.destroy();
// }
// Run and collect the results from the standard output and error output
String stdStr = IOUtils.toString(process.getInputStream());
String errStr = IOUtils.toString(process.getErrorStream());
process.waitFor();
return new Outputs(stdStr, errStr);
}
正如@EJP建议的,您可以使用不同的线程来捕获流或使用ProcessBuilder
或从您的命令重定向到文件。
我认为您可以使用以下 3 种方法。
-
对流使用不同的线程。
Process process = Runtime.getRuntime().exec("cat ");
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);
Future<String> output = newFixedThreadPool.submit(() -> {
return IOUtils.toString(process.getInputStream());
});
Future<String> error = newFixedThreadPool.submit(() -> {
return IOUtils.toString(process.getErrorStream());
});
newFixedThreadPool.shutdown();
// process.waitFor();
if (!process.waitFor(3, TimeUnit.SECONDS)) {
System.out.println("Destroy");
process.destroy();
}
System.out.println(output.get());
System.out.println(error.get());
-
Using ProcessBuilder
ProcessBuilder processBuilder = new ProcessBuilder("cat")
.redirectError(new File("error"))
.redirectOutput(new File("output"));
Process process = processBuilder.start();
// process.waitFor();
if (!process.waitFor(3, TimeUnit.SECONDS)) {
System.out.println("Destroy");
process.destroy();
}
System.out.println(FileUtils.readFileToString(new File("output")));
System.out.println(FileUtils.readFileToString(new File("error")));
在命令中使用重定向运算符将输出和错误重定向到文件,然后从文件读取。
Here http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2是非常好的博客,解释了不同的处理方法Runtime.Exec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)