[英]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.