首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何刻不容缓地读取Java InputStream?

如何刻不容缓地读取Java InputStream?
EN

Stack Overflow用户
提问于 2013-04-17 15:02:17
回答 2查看 901关注 0票数 0

我有C++程序(feeder.exe),它打印一些数据:

代码语言:javascript
复制
printf("%s\n", line);

它平均每秒产生20-30行,但不是均匀的.

我希望通过从Java代码中运行exe来捕获Java程序中的这些数据:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 15:16:26

如果重定向,可能会缓冲stdout,这意味着问题在C++代码中而不是在Java端。一旦缓冲区满了,C++进程将缓冲输出并同时刷新几个“printf”。

如果您能够修改C++软件,请尝试在printf之后执行一个fflush(stdout);,以强制刷新输出缓冲区。

票数 2
EN

Stack Overflow用户

发布于 2013-04-17 15:22:41

最有可能的原因是,feeder.exe没有定期刷新其输出流,而且数据处于其输出缓冲区中,直到缓冲区被填充并最终写入为止。

如果这是原因,那么在Java方面您无法避免这种情况。这个问题只能通过修改feeder应用程序来解决。

请注意,如果数据位于连接两个进程的“管道”中,那么Java端的读取将得到数据。假设行尾已经写入管道,readLine()调用将在不阻塞的情况下传递线路。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16063556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档