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

标签 java windows

我在 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();
                }
            }

最佳答案

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

关于java - 如何在没有缓冲的情况下从 Java 中的另一个应用程序读取 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985370/

相关文章:

Windows 10 OpenSSH key 格式无效

php - 防止程序执行其他程序

java - 如何在 Java 中解码 DER 编码的字符串?

java - 使用 OpenCSV 根据特定行值查找 csv 文件的确切部分

python - 使用 tkinter 获取命令窗口输出以显示在小部件中

c - 在有或没有 UNICODE 支持的情况下,如何在我的程序中使用 _stprintf?

c# - .NET 关于文件路径的奇怪行为

java - Kafka - 消费者偏移量自动重置

java - 接受所有输入后如何跳出 while 循环?

Java用特殊字符分割