我正在尝试从Java调用C程序并捕获标准输出。这是我的代码:
try {
ProcessBuilder pb = new ProcessBuilder("helloworld.exe");
pb.redirectErrorStream(true); // Merge std out and std err into same stream
program = pb.start(); // Start program
BufferedReader input = new BufferedReader(new InputStreamReader(program.getInputStream()));
line = input.readLine();
while (line != null) {
System.out.println(line);
line = input.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
以下是一个示例c程序:
int main(){
printf("Hello world\n");
}
当我正在执行的程序(在这种情况下为helloworld)中没有getchar()
时,这可以正常工作。但是,如果我在printf之后添加getchar()
,我从来没有从输入流中获得任何东西。有什么想法吗?
由于
答案 0 :(得分:1)
正如Kyle所说,您可能需要在调用print后刷新输出流,以确保字符实际上没有延迟地转到标准输出。你应该在两个程序中都这样做。这可以使用fflush(stdout);
在C中完成,并且可以使用System.out.flush()
之类的内容在Java中完成。
- 大卫
答案 1 :(得分:1)
因为当C程序调用getchar时,C程序停止等待输入。输入永远不会来!毕竟,您的Java程序捕获stdout / stderr,但没有关于附加到stdin。
使用program
对象上的getOutputStream() instance method in the Process class获取代表stdin的流,类似于getInputStream()。
然后将数据发送到C程序期望的C程序。
答案 2 :(得分:0)
显然,子进程(或OS或JAVA Runtime或......,...)在将输出发送到父进程之前仍在等待char(getchar
)。
如果您不需要输入,请不要包含getchar
!!