使用getchar()从C程序获取Java标准输出时遇到问题

时间:2011-07-01 15:52:16

标签: java c inputstream

我正在尝试从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(),我从来没有从输入流中获得任何东西。有什么想法吗?

由于

3 个答案:

答案 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 !!