我正在爲Java中的命令行程序編寫終端包裝,並使用ProcessBuilder產生子進程。要將擊鍵發送到子進程,我只需從GUI直接寫入e.getKeyChar()
到由proc.getOutputStream()
給出的OutputStream
即可。爲了接收從子進程的輸出,我基本上有一個while循環,從讀取子的stdout
:Java:無法從進程獲取標準輸出數據,除非手動刷新
while ((b = br.read()) != -1) {
System.out.println("Read "+b);
bb[0] = (byte) b;
// call an event listener with the read byte
listener.dataReceived(bb);
}
這工作,只有,如果我馬上刷新上兩個兩端輸出。也就是說,我必須刷新每個用戶輸入,並且子進程必須刷新它自己的stdout
才能發生。否則,read()
塊,等待數據,這是永遠不會實際發送(子進程'stdout只是保持緩衝)。我如何獲得I/O?
例終端子:
#include <stdio.h>
int main() {
char c;
while((c = getchar()) != -1) {
printf("Got: %d\n", c);
// doesn't work in my Java program if the next line isn't present
fflush(stdout);
}
return 0;
}
我在Ubuntu 10.10上運行使用Sun Java 6
對,但是用我的Java程序,I/O *永遠不會*發送,而如果我手動在終端中運行所述子進程,I/O幾乎是即時的。 – erjiang 2010-11-20 17:22:33
是的,我們知道我們必須處理它。問題是如何。 – jononomo 2013-08-19 17:56:24