我有C ++程序(feeder.exe),它打印一些数据:
printf("%s\n", line);
平均每秒产生20-30行,但不均匀。
我想通过运行Java代码中的exe来在Java程序中捕获这些数据:
package temp_read;
import java.io.*;
public class Main {
public static void main(String[] args) throws Throwable {
Process p = Runtime.getRuntime().exec("d:/feeder.exe");
InputStream is = p.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(System.currentTimeMillis() + "," + line);
}
}
}
但是当我查看输出时,我发现它每3-5秒收到一次大量的字符串。
问题:如何在打印到stdout时立即从feeder.exe接收数据而没有任何延迟?
PS:没有相关问题:如果我通过Ctrl + C停止java,如何停止feeder.exe?
答案 0 :(得分:2)
如果重定向,stdout可能是缓冲的,这意味着问题出在C ++代码中而不是Java端。一旦缓冲区已满,C ++进程将缓冲输出并立即刷新几个“printf”。
如果您能够修改C ++软件,请尝试在printf之后执行fflush(stdout);
以强制刷新输出缓冲区。
答案 1 :(得分:1)
最可能的原因是feeder.exe
没有定期刷新其输出流,并且数据位于其输出缓冲区中,直到缓冲区填满并作为结果写入。
如果这是原因,那么你无法在Java端做任何事情来避免这种情况。只能通过修改feeder
应用程序来解决问题。
请注意,如果数据位于" pipe"连接这两个进程,然后在Java端读取将得到它。假设已经将行尾写入管道,readLine()
调用将在不阻塞的情况下传递该行。