排除Java中的标准错误
当从Java启动进程时,如果我不从管道读取,stderr和stdout都可以阻止输出。 目前我有一个主动从一个主线程读取的线程和另一个主线程块。
有没有一种简单的方法来加入两个流或以其他方式导致子进程继续而不丢失stderr中的数据?
在ProcessBuilder上设置redirectErrorStream属性以将stderr输出发送到stdout:
ProcessBuilder builder = new ProcessBuilder(command); builder.redirectErrorStream(true);
然后,您应该创建一个线程来处理流程,如下所示:
Process p = builder.start(); InputHandler outHandler = new InputHandler(p.getInputStream());
其中InputHandler定义为:
private static class InputHandler extends Thread { private final InputStream is; private final ByteArrayOutputStream os; public InputHandler(InputStream input) { this.is = input; this.os = new ByteArrayOutputStream(); } public void run() { try { int c; while ((c = is.read()) != -1) { os.write(c); } } catch (Throwable t) { throw new IllegalStateException(t); } } public String getOutput() { try { os.flush(); } catch (Throwable t) { throw new IllegalStateException(t); } return os.toString(); } }
或者,只需为InputStream和ErrorStream创建两个InputHandler。 如果你不读它就知道程序会阻塞是90%的战斗:)
只有两个线程,一个从stdout读取,一个来自stderr?