【问题标题】:BufferedReader hangs when reading output from a C program从 C 程序读取输出时,BufferedReader 挂起
【发布时间】:2012-06-29 18:10:50
【问题描述】:

我正在用 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() 调用的程序的窗口?这样当我向它发送字符串或从其输出中读取时,我可以检查是否还有其他问题。

【问题讨论】:

  • 在 C 程序中尝试一些 fflush(stdout)?如果不发送到终端,输出可能不会被行缓冲。
  • 试过了,没用。会不会和编码有关?
  • 如果调用 br.ready() 会发生什么?当它返回true时,应该有数据可供读取。
  • br.ready() 即使应该有数据要读取,也会返回 false(我尝试从控制台使用相同的命令序列并且它工作正常)。会不会是因为到标准输入的 OutputStream 保持打开状态?
  • 是的,它可以。如果您没有(更多)输出要交付给程序,请关闭它。

标签: java bufferedreader runtime.exec


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我在 C 程序输出的每个字符串中都附加了一个 '\n',并且从终端它可以正常工作。我认为 read() 也不会起作用,因为正如我上面所说的 ready() 返回 false。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多