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

标签 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?

谢谢, 杰杰

最佳答案

您正在尝试读取 stdout 的全部 - 这基本上会阻塞,直到进程完成 - 然后读取 stderr 的全部

使用两个线程,一个从 stdout 读取,一个从 stderr 读取 - 这样,“下一个”哪一个有数据并不重要,您将从两个线程中读取数据。

关于java - 如何在Runtime.exec中实时获取stdout和stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9548232/

相关文章:

java - JAX-RS Cookie 响应未在浏览器中显示

java - 有没有办法在Java中检测Mac OS或Windows OS是否处于暗模式

Java - 比较父类对象的子属性

Java:如何让扫描仪仅匹配第一次出现的情况,如果之前已匹配过则跳过

java - 如何在java运行时exec方法中给出长路径?

带重定向的 java getRuntime().exec()

javascript - Apache HTTPClient 在相互身份验证期间不发送客户端证书

java - 尝试启动 Nmap.exe 时 Java Runtime.exec() 出现问题

java - 外部程序的退出值错误

Java运行Python脚本问题