【发布时间】:2015-02-17 17:50:01
【问题描述】:
我有一个带有以下代码的 Java 工具:
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
// any error message?
StreamGobblerLocal errorGobbler = new StreamGobblerLocal(proc.getErrorStream(), "ERROR");
// any output?
StreamGobblerLocal outputGobbler = new StreamGobblerLocal(proc.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
// any error???
int exitVal = proc.waitFor();
commandResultBean.setCLI_ReturnValue(exitVal);
它可以工作,但是当子进程的输出很大时,它会死锁。我几乎可以肯定问题出在以下位置:
由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能导致子进程阻塞,甚至死锁。
我在这里找到它:http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html
我该如何解决这个问题?大输出就像记事本中的 30000 行,我必须记录这些行。
我的代码是从这篇文章中复制的,所以你可以在这里查看我没有复制的实现。
http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
请注意,我不是该工具的第一个开发者,因此我很难回答诸如“你为什么使用这个”之类的问题或类似的问题。
任何帮助表示赞赏,在此先感谢。
【问题讨论】:
标签: java process outputstream