【发布时间】: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