我有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秒接收大量字符串。
问题:如何在打印到标准输出时立即从feeder.exe接收数据?
PS:不相关的问题:如果我通过feeder.exe停止java,如何停止Ctrl+C?
发布于 2013-04-17 15:16:26
如果重定向,可能会缓冲stdout,这意味着问题在C++代码中而不是在Java端。一旦缓冲区满了,C++进程将缓冲输出并同时刷新几个“printf”。
如果您能够修改C++软件,请尝试在printf之后执行一个fflush(stdout);,以强制刷新输出缓冲区。
发布于 2013-04-17 15:22:41
最有可能的原因是,feeder.exe没有定期刷新其输出流,而且数据处于其输出缓冲区中,直到缓冲区被填充并最终写入为止。
如果这是原因,那么在Java方面您无法避免这种情况。这个问题只能通过修改feeder应用程序来解决。
请注意,如果数据位于连接两个进程的“管道”中,那么Java端的读取将得到数据。假设行尾已经写入管道,readLine()调用将在不阻塞的情况下传递线路。
https://stackoverflow.com/questions/16063556
复制相似问题