我有一个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);
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是当子进程的输出很大时,它会死锁.我几乎可以肯定问题在于:
由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞甚至死锁.
我在这里找到了它: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
请注意,我不是该工具的第一个开发人员,所以我很难回答诸如"你为什么使用这个"或类似问题的问题.
任何帮助表示感谢,提前谢谢.