代码之家  ›  专栏  ›  技术社区  ›  Jason Cohen

Java中的标准错误

  •  4
  • Jason Cohen  · 技术社区  · 17 年前

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

    2 回复  |  直到 12 年前
        1
  •  4
  •   Mat Mannion    17 年前

    在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%:)

        2
  •  0
  •   killdash10    17 年前

    只有两个线程,一个从stdout读取,一个从stderr读取?