我正在尝试运行忽略其输出的程序,但是当它的输出很大时它似乎挂起。我的代码如下:
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'。
答案 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