从Java开始,我运行一个C ++应用程序,它在进行过程中记录其进度,并且希望监视持续的进展,因此(在Java中)我监视process.getInputStream()和process.getErrorStream()。当我从命令行运行C ++应用程序时,日志在进行时一次出现一行(大约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();
}
}
答案 0 :(得分:2)
这是在stdio
库中进行缓冲的源进程。在Java端你无能为力。你必须将fflush()
调用放入C ++代码中,或者忍受它并等待。当您从cmd.exe运行时,数据会实时显示,因为当stdio附加到它认为是真正的终端时,它的行为会有所不同。