从C程序读取输出时,BufferedReader挂起

时间:2012-06-29 18:10:50

标签: java bufferedreader runtime.exec

我正在用Java编写一个程序,它将命令发送到C程序并读取其输出,但是当我尝试实际读取输出时,我看到它挂起。 代码是:

    import java.io.*;
    public class EsecutoreC {
        private String prg;
        OutputStream stdin=null;
        InputStream stderr=null;
        InputStream stdout=null;
        BufferedReader br;
        Process pr;
        public EsecutoreC(String p){
            prg=p;
            try {
                pr=Runtime.getRuntime().exec(prg);
                stdin=pr.getOutputStream();
            stderr=pr.getErrorStream();
            stdout=pr.getInputStream();
                    br=new BufferedReader(new InputStreamReader(stdout));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public void sendInput(String line){
        line=line+"\n";
        try {
            stdin.write(line.getBytes());
            stdin.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }

}
public BufferedReader getOutput(){
    return br;
}
}

当我需要读取程序的输出时,我只需使用getOutput来获取BufferedReader,然后调用readLine()。我看到该程序挂起,因为我在调用readLine之后立即放入了println并且没有打印出来。我还在C程序的每一行输出后添加\ n。 另外,有没有办法显示通过Runtime.getRuntime()。exec()调用的程序窗口?所以当我向它发送字符串或从输出中读取时,我可以检查是否有任何其他问题。

1 个答案:

答案 0 :(得分:0)

当您调用readLine()时,BufferedReader将阻塞,直到输出中出现新的行字符'\n'。尝试从终端/命令行调用C程序,看看输出是否真的终止于新行。

或者你可以一次只read(1)一个字符(然后不需要BufferedReader)并立即打印。

编码不会影响'\n'字符。