Java 中的排出标准错误

Jas*_*hen 5 java multithreading process-management

从 Java 启动进程时,如果我不从管道读取数据,stderr 和 stdout 都会阻塞输出。目前,我有一个线程主动从一个线程读取数据,而主线程则在另一个线程上阻塞。

有没有一种简单的方法来连接两个流或以其他方式导致子进程继续,同时不丢失 stderr 中的数据?

Mat*_*ion 4

在 ProcessBuilder 上设置 redirectErrorStream 属性以将 stderr 输出发送到 stdout:

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Run Code Online (Sandbox Code Playgroud)

然后,您应该创建一个线程来处理进程流,如下所示:

Process p = builder.start();

InputHandler outHandler = new InputHandler(p.getInputStream());
Run Code Online (Sandbox Code Playgroud)

其中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();
    }

}
Run Code Online (Sandbox Code Playgroud)

或者,只需为InputStream 和ErrorStream 创建两个InputHandler。知道如果不阅读它们,程序就会阻塞,这已经成功了 90% :)