gpt4 book ai didi

Java:除非手动刷新,否则无法从进程获取标准输出数据

转载 作者:行者123 更新时间:2023-11-30 06:36:51 26 4
gpt4 key购买 nike

我正在为 Java 命令行程序编写终端包装器,并使用 ProcessBuilder 生成子进程。要将击键发送到子进程,我只需将 e.getKeyChar() 从 GUI 直接写入 proc.getOutputStream() 给出的 OutputStream .为了从子进程接收输出,我基本上有一个 while 循环,它从子进程的 stdout 读取:

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() 会阻塞,等待从未真正发送过的数据(子进程的标准输出只是保持缓冲)。我怎样才能启动 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 程序无法控制(*)外部进程何时刷新其输出并将数据写入磁盘/管道缓冲区/套接字缓冲区。您完全受制于外部程序的缓冲行为。这在每个操作系统和每种编程语言中都是如此。

每个网络程序员都必须处理这个,所以就处理吧。

(*) - 有时某些程序(例如 cat)有选项 (-u) 来指示程序使用无缓冲输出。否则你就是摆布了

关于Java:除非手动刷新,否则无法从进程获取标准输出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4230837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com