2012-06-29 34 views
0

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

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

在C程序中尝试一些fflush(stdout)?如果没有发送到终端,输出可能不会被行缓冲。 –

+0

试过了,没有工作。它可能与编码有关吗? – Orgrim

+0

如果你调用br.ready(),会发生什么?当它返回true时,应该有用于阅读的数据。 – Nick

回答

0

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

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

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

+0

是的,我为C程序输出的每一个字符串附加一个'\ n',并从终端正常工作。我不认为read()也可以工作,因为正如我上面所说的,ready()返回false。 – Orgrim

相关问题