【问题标题】:Process output is too big进程输出太大
【发布时间】: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


    【解决方案1】:

    一周后,我决定分享我在这种情况下所做的事情。更好的答案仍然值得赞赏。

    这就像一种解决方法,但效果很好。你可以添加这一行:

     cmd += " >> " + outputFileName;
    

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

    希望这个答案有用。

    【讨论】:

    • 我遇到了类似的问题,但是您在上面提出的答案在 Linux 上引起了我的问题,因为我需要使用许多线程并且它会阻塞它们,无论如何感谢分享
    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多