嗨,我正在尝试从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
源代码中解决此问题。每当该应用程序写入其每秒一次的输出时,它之后都应刷新其输出流。也许有一些选择可以启用该行为。如果没有,并且该程序的源代码不在您的控制范围内,请要求开发人员添加刷新功能,以实现更好的集成。