如何在Runtime.exec中实时获取stdout和stderr



我有以下代码:

 Process runJob = null;
    try {
        runJob = Runtime.getRuntime().exec(args);
    InputStream cmdStdErr = null;
    InputStream cmdStdOut = null;
    cmdStdErr = runJob.getErrorStream();
    cmdStdOut = runJob.getInputStream();

    String line;
    BufferedReader stdOut = new BufferedReader (new InputStreamReader (cmdStdOut));
    while ((line = stdOut.readLine ()) != null) {
        logger.info(line);
    }
    cmdStdOut.close();
    // send error to Ab Initio and exit
    BufferedReader br = new BufferedReader(new InputStreamReader(cmdStdErr));
    String errMsg="";
    while ((line = br.readLine()) != null) {
        logger.info(line);
        errMsg += line;
    }
    cmdStdErr.close();
    res = runJob.waitFor();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

问题是,当作业运行时,它会产生大量输出,但stdout和stderr的inputstream只有在作业完成后才会打印输出。

有没有一种方法可以实时获取输出,即在作业输出stderr和stdout时获取它们?

谢谢,JJ

您正在尝试读取stdout的所有,然后读取stderr的全部

使用两个线程,一个从stdout读取,另一个从tderr读取——这样,它们中的哪一个"下一个"有数据并不重要,您将从这两个线程中读取。

不要使用那些BufferedReader;他们正在缓冲数据(当然),这意味着将数据存储起来,而不一定马上传递。如果您只是为了使用readLine()而使用它们,那么可以传递0的第二个构造函数参数,这基本上关闭了缓冲

另请参阅@JonSkeet关于在后台同时读取booth stdout和stderr的回答。

最新更新