我正在为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