簡體   English   中英

如何立即閱讀Java InputStream?

[英]How to read Java InputStream without delay?

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

如果重定向,則可能會緩沖stdout,這意味着問題出在C ++代碼中,而不是Java端。 一旦緩沖區已滿,C ++進程將緩沖輸出並立即刷新多個“ printf”。

如果您能夠修改C ++軟件,請嘗試執行fflush(stdout); 在printf之后,強制刷新輸出緩沖區。

最可能的原因是feeder.exe沒有定期刷新其輸出流,並且數據一直位於其輸出緩沖區中,直到緩沖區填滿並被寫入為止。

如果這是原因,那么在Java方面您無能為力。 該問題只能通過修改feeder應用程序來解決。


請注意,如果數據位於連接兩個進程的“管道”中,則在Java端讀取將得到數據。 假定行尾已寫入管道, readLine()調用將傳遞該行而不會阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM