我有一个带有以下代码的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
请注意,我不是该工具的第一个开发人员,所以我很难回答像#34;你为什么使用这个"或类似的问题。
任何帮助表示感谢,提前谢谢。
答案 0 :(得分:3)
一周后,我决定分享我在这种情况下所做的事情。更好的答案仍然赞赏。
这就像一个解决方法,但效果很好。您可以添加以下行:
cmd += " >> " + outputFileName;
这样,Windows上的cmd和Mac上的bash(Unix也是如此)将完成工作,并在日志记录过程中跳过java部分。您还可以使用其他方法读取文件,该方法可以处理大量数据,并在代码中的任何位置使用输出。
希望这个答案有用。