Process.getInputStream()似乎覆盖了子进程的输出?

时间:2018-01-24 14:12:43

标签: java c++ asynchronous process

我试图通过监听STDOUT / STDERR从Java获取程序的输出(用C ++编写)。当我通过控制台运行C ++程序时,我能够正确地看到预期的输出,并且它工作正常。但是,当程序结束时(我基本上是在查找错误代码),它几乎立即吐出3-4行然后结束输出。从控制台查看输出时,这很好。但是,当从java中听STDOUT时,我错过了输出中的最后一行,并且线条似乎是"碰撞",像这样:

INFO: max_encoded_bytes = 76475 aERROR: RTMP_Connect0, failed to connect socket. 110 (Connection timed out).

当他们看起来像这样:

INFO: max_encoded_bytes = 76475 at [line 939: program.cpp]
ERROR: RTMP_Connect0, failed to connect
FATAL: Error code 200

我的代码目前看起来像这样:

processBuilder.redirectErrorStream(true);

processLock.lock();

logger.debug("Starting " + name + " process");

try {
    Process process = processBuilder.start();

    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    Future<?> outputFuture = executor.submit(() -> {
        br.lines().forEach(line -> {
            outputHandler.handleOutput(line);
        });
    });

    try {
        process.waitFor();
        outputFuture.get();
        logger.debug(name + " process completed naturally");
    } catch (ExecutionException e) {
        logger.error("ExecutionException during " + name + " process: " + e.getMessage());
    } catch (InterruptedException e) {
        logger.debug(name + " process interrupted");
        process.destroy();
    } finally {
        br.close();
        isr.close();
        is.close();
    }
catch (IOException e) { } //etc

基于我查看网络上的资源,这似乎是处理输出的标准。 我正在审查其他一些似乎相似的SO问题,但由于他们的情况与我的情况不同,我并不确定(见herehere)。

我尝试通过一大堆不同的库来改变我从STDOUT读取的方式(删除BufferedStream,直接使用InputStream,使用ByteArrayOutputStream,将缓冲区大小更改为一些荒谬的大小值等)。为了匹配控制台输出并打印出每一行的目标,我该怎样做才能得到我认为应该得到的输出?

0 个答案:

没有答案