Java 进程输出太大

Java 进程输出太大,java,process,outputstream,Java,Process,Outputstream,我有一个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 S

我有一个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);
它可以工作,但是当子流程的输出很大时,它就会死锁。我几乎可以肯定问题出在以下方面:

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能会导致子流程阻塞,甚至死锁

我在这里找到的:

我怎样才能解决这个问题?大输出就像记事本中的30000行,我必须记录这些行

我的代码是从本文复制的,所以您可以检查我没有复制到这里的实现

请注意,我不是这个工具的第一个开发人员,所以我很难回答诸如“你为什么使用这个”或类似的问题


感谢您的帮助。一周后,我决定与大家分享我在这种情况下所做的一切。更好的答案仍然值得赞赏

这就像一个解决办法,但效果相当不错。您可以添加以下行:

 cmd += " >> " + outputFileName;
这样,Windows上的cmd和Mac上的bash(也是Unix)将完成这项工作,并在日志记录过程中跳过java部分。您还可以使用其他方法读回该文件,该方法可以处理如此大量的数据,并在代码中的任何位置使用输出


希望这个答案会有用。

我遇到了一个类似的问题,但是你上面提出的答案在Linux上给我带来了问题,因为我需要使用许多线程,它会阻止它们,无论如何,谢谢分享