嗨,我正在尝试从Java程序执行外部程序并读取stdout消息in real time,而无需等待程序退出。但是,我发现在不同的.exe程序中存在不同的stdout行为,并且我不知道如何处理它。

范例1:
server1.exe是一个控制台程序。当我运行它时,它将持续监听端口。当客户端连接到它时,它将每1秒生成1行stdout输出。除非我按“ ctrl-C”,否则它不会退出。

在命令提示符下,运行以下命令:

server1.exe > stdout.out 2> stderr.err


当客户端连接到它时,我发现stdout.out file将实时更新。即使server1.exe仍在运行,我也可以打开stdout.out file并实时读取stdout输出。

范例2:
与server1.exe类似,server2.exe也是一个控制台程序。当我运行它时,它还将持续监听端口。当客户端连接到它时,它将每1秒生成1行标准输出输出。除非我按“ ctrl-C”,否则它不会退出。

在命令提示符下,运行以下命令:

server2.exe > stdout.out 2> stderr.err


即使客户端已连接到server2.exe,我仍然发现stdout.out file为空。只要server2.exe仍在运行,就不会将stdout写入stdout.out file。该文件未在real time中更新。当我按ctrl-C时,它突然将许多行的输出写入stdout.out file

假设我在t = 11按下ctrl-C,它将把从t = 1直到t = 11的所有stdout输出写入stdout.out file。在此之前,在t = 10处,stdout.out文件为空。


示例2中的程序给我带来了问题,因为我无法在Java程序中read the stdout in real time。我的java程序如下:

process = Runtime.getRuntime().exec(command);

input = new BufferedReader(new InputStreamReader(process.getInputStream()));

String inputtext = null;

while ((inputtext = input.readLine()) != null)
{
    //print out the text in Real Time, when the .exe program is still running
}


我是否可以知道为什么除非按stdout output,示例2中的程序才会生成ctrl-C

奇怪的是,当我在控制台窗口中手动运行该程序时,我可以看到每1秒在控制台窗口上打印一次stdout输出。但是,当我尝试使用inputtext = input.readLine()从Java读取它时,只要程序仍在运行,inputtext就会是null(我已经通过打印出inputtext对其进行了测试)。当我按ctrl-C时,BufferedReader会突然被所有待处理的stdout输出填充。

如何实时读取server2.exe的stdout

最佳答案

您描述事物的方式在第二台服务器中发生了一些缓冲。除非服务器连接到实时交互式控制台窗口,否则服务器可能会决定在内部缓冲输出。

尽管可能存在ways to work around this,但我将在server2源代码中解决此问题。每当该应用程序写入其每秒一次的输出时,它之后都应刷新其输出流。也许有一些选择可以启用该行为。如果没有,并且该程序的源代码不在您的控制范围内,请要求开发人员添加刷新功能,以实现更好的集成。

09-10 06:39
查看更多