执行程序挂起(可能由于输出太多)

时间:2011-06-24 17:52:07

标签: java execute

我正在尝试运行忽略其输出的程序,但是当它的输出很大时它似乎挂起。我的代码如下:

Process p = Runtime.getRuntime().exec("program");
p.getOutputStream().write(input.getBytes());
p.getOutputStream().flush();
p.getOutputStream().close();
p.waitFor();

忽略输出的最佳方法是什么?

我尝试将输出重定向到/ dev / null,但是我得到了一个Java IOException'Broke pipe'。

3 个答案:

答案 0 :(得分:1)

你有没有尝试过:

Process p = Runtime.getRuntime().exec("program >/dev/null 2>&1");

我记得以前必须在Java中做类似的事情,但我可能没有用同样的方式调用这个过程。

编辑:我刚测试了这段代码并成功完成了。

class a
{
    public static void main(String[] args) throws Exception
    {
        Process p = Runtime.getRuntime().exec("cat a.java >/dev/null 2>&1");
        p.getOutputStream().write(123123);
        p.getOutputStream().flush();
        p.getOutputStream().close();
        p.waitFor();
    }
}

答案 1 :(得分:0)

你不能“忽略”Java中子进程的输出,至少在技术上是这样。您应该读取输入流的内容,否则将导致另一端的输出缓冲区填满,从而导致所描述的挂起行为。当子进程尝试写入完整输出缓冲区时,它将阻塞,直到通过读取清除缓冲区为止。

如果您不想输出,至少要阅读并丢弃它。 或使用NullInputStream。您不必使用Apache Commons类;您可以构建自己的NullInputStream类,其read方法具有空体,类似于NullOutputStreams

此外,单独读取输入流可能无法解决此问题。您还必须读取错误流,这可能会重定向到输入流。

答案 2 :(得分:0)

我会使用Stream Gobbler。有关详情,请查看此处:What to do when Runtime.exec() won't