【发布时间】:2011-05-12 23:07:57
【问题描述】:
我正在用 Java 为命令行程序编写终端包装器,并使用 ProcessBuilder 生成子进程。要将击键发送到子进程,我只需将 GUI 中的e.getKeyChar() 直接写入proc.getOutputStream() 给出的OutputStream。为了从子进程接收输出,我基本上有一个从子进程的stdout 读取的while 循环:
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);
}
只有在我立即刷新 both 两端的输出时才有效。也就是说,我必须刷新每个用户输入,并且子进程必须刷新自己的 stdout 才能使事情发生。否则,read() 阻塞,等待数据,这些数据从未真正发送(子进程的标准输出只是保持缓冲)。如何让 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;
}
我在带有 Sun Java 6 的 Ubuntu 10.10 上运行。
【问题讨论】: