如何快速阅读Java InputStream?

时间:2013-04-17 15:02:18

标签: java inputstream stdout

我有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?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

最可能的原因是feeder.exe没有定期刷新其输出流,并且数据位于其输出缓冲区中,直到缓冲区填满并作为结果写入。

如果这是原因,那么你无法在Java端做任何事情来避免这种情况。只能通过修改feeder应用程序来解决问题。


请注意,如果数据位于" pipe"连接这两个进程,然后在Java端读取将得到它。假设已经将行尾写入管道,readLine()调用将在不阻塞的情况下传递该行。