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