如何在没有缓冲的情况下从Java中的另一个应用程序读取STDOUT


Java开始,我运行一个C应用程序,它在进行过程中记录它的进度,并希望监视持续的进展,因此(在Java中)我监视process.getInputStream()和process.getErrorStream().当我从命令行运行C app时,日志在进行时一次出现一行(大约1行非常1-2秒).从Java监视器,我没有实时获取数据,并且不确定是谁在缓冲它.

我可以查看C代码(尽管它相当复杂)并尝试根据需要调用flush()调用,但是当我从cmd.exe运行时数据实时出现,所以在我这样做之前,我想检查一下我是否还有其他事情需要做. Java中是否有必要实时获取数据,以确保输入流不被缓冲?

我在Windows XP及更高版本中运行.

我试过了

            for (;;) {
                int c = is.read();
                if (c < 0) {
                    break;
                }
                System.out.print(c);
                System.out.flush();
            }
            if (true) {
                return;
            }

并尝试过

            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                synchronized (lastActivityTime) {
                    lastActivityTime = java.util.Calendar.getInstance().getTimeInMillis();
                }
                if (pw != null) {
                    pw.println(type + line);
                    pw.flush();
                }
            }

最佳答案 它是在stdio库中进行缓冲的源进程.在Java端你无能为力.你必须将fflush()调用放入C代码中,或者忍受它并等待.当您从cmd.exe运行时,数据会实时显示,因为当stdio附加到它认为是真正的终端时,它的行为会有所不同.

点赞