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

时间:2012-03-03 17:35:04

标签: java runtime.exec

我有以下代码:

 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的输入流仅在作业完成后打印输出。

有没有办法实时获取该输出,即在作业输出时获取stderr和stdout?

谢谢, JJ

2 个答案:

答案 0 :(得分:2)

不要使用那些BufferedReader;他们正在缓冲数据(当然),这意味着存储它并不一定要立即传递它。如果您只是使用它们以便可以使用readLine(),则传递0的第二个构造函数参数,该参数实际上会关闭缓冲。

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

答案 1 :(得分:2)

您正在尝试读取 stdout的所有 - 这将基本上阻止直到该过程完成 - 然后所有的stderr。

使用两个线程,一个从stdout读取,另一个从stderr读取 - 这样,无论“下一个”哪个有数据都没关系,你将从这两个读取。