我试图通过监听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问题,但由于他们的情况与我的情况不同,我并不确定(见here和here)。
我尝试通过一大堆不同的库来改变我从STDOUT读取的方式(删除BufferedStream,直接使用InputStream,使用ByteArrayOutputStream,将缓冲区大小更改为一些荒谬的大小值等)。为了匹配控制台输出并打印出每一行的目标,我该怎样做才能得到我认为应该得到的输出?