从 Java 启动进程时,如果我不从管道中读取,stderr 和 stdout 都会阻塞输出。目前,我有一个线程主动从一个线程中读取数据,而另一个线程则从主线程块中读取。
是否有一种简单的方法可以连接两个流或以其他方式导致子进程继续,同时不会丢失 stderr 中的数据?
从 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 读取?