输出停止从我的进程读取

时间:2012-02-01 06:14:19

标签: java exec

我有一些非常简单的Java代码,我正在启动另一个进程并尝试将所有标准输出和标准错误记录到SLF4J。

this.service.serverProcess = Runtime.getRuntime().exec(arguments);

this.service.serverIsRunning = true;

BufferedReader serverStdout = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getInputStream()), 16);
BufferedReader serverStderr = new BufferedReader(new InputStreamReader(
                    this.service.serverProcess.getErrorStream()), 16);

String stdoutLine = null;
String stderrLine = null;

while ((stdoutLine = serverStdout.readLine()) != null || 
        ((stderrLine = serverStderr.readLine()) != null)) {
    if (stdoutLine != null && stdoutLine.trim().length() > 0)
        logger.info("{}", stdoutLine);
    if (stderrLine != null && stderrLine.trim().length() > 0)
        logger.error("{}", stderrLine);
}

try { this.service.serverProcess.waitFor(); } catch (InterruptedException e) {};

this.service.serverIsRunning = false;

不幸的是,我只是从我的进程获得第一行输出,我从来没有看到比这更多的输出,虽然我确信有比我看到的更多的输出。

这里出了什么问题?我希望它能在事件发生时立即记录,因为输出对于我保留的日志非常重要。如何获得我的Process的STDOUT和STDERR的完整输出?

1 个答案:

答案 0 :(得分:2)

我怀疑问题是你永远不会从stderr读取 - 所以如果进程已经填满了stderr的任何缓冲区但是没有向stdout打印任何东西,那么你将阻止尝试读取stdout。 / p>

我建议你在另一个线程中启动一个读取循环:一个从stdout读取,一个从stderr读取。