2012-06-29 4 views
0

C 프로그램에 명령을 보내고 출력을 읽는 Java 프로그램을 작성하고 있지만 출력을 실제로 읽으려고하면 멈추는 것을 볼 수 있습니다. 코드는 다음과 같습니다 나는 프로그램의 출력을 읽을 필요하면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; 
} 
} 

, 나는 단지의 BufferedReader를 얻을 수 getOutput를 사용하고 난() 내의 readLine를 호출합니다. readLine 호출 후 바로 println을 넣었으므로 아무 것도 인쇄되지 않기 때문에 프로그램이 멈추는 것을 볼 수 있습니다. 또한 C 프로그램의 각 출력 행 뒤에 \ n을 추가합니다. 또한 Runtime.getRuntime(). exec()를 통해 호출 된 프로그램의 창을 표시하는 방법이 있습니까? 그래서 문자열을 보낼 때 또는 출력에서 ​​읽을 때 다른 문제가 있는지 확인할 수 있습니다.

+1

C 프로그램에서 fflush (stdout)를 시도해보십시오. 터미널에 전송되지 않으면 출력은 아마도 버퍼에 저장되지 않습니다. –

+0

시도해 보니 작동하지 않았습니다. 그것은 인코딩과 관련이 있을까요? – Orgrim

+0

br.ready()를 호출하면 어떻게됩니까? true를 반환하면 읽을 데이터가 있어야합니다. – Nick

답변

0

readLine()으로 전화 할 때 출력에 줄 바꿈 문자 '\n'이있을 때까지 BufferedReader가 차단됩니다. 터미널/명령 줄에서 C 프로그램을 호출 해보십시오. 실제로 출력이 새로운 줄에서 종료되는지보십시오.

또는 한 번에 read(1) 한 문자 씩 (BufferedReader 필요 없음) 즉시 인쇄 할 수 있습니다.

인코딩은 '\n' 문자에 영향을주지 않습니다.

+0

예, C 프로그램이 출력하는 모든 문자열에 '\ n'을 추가하고 올바르게 작동합니다. 나는 ready()가 false를 반환한다고 언급 했으므로 read()가 어느 것이 든 작동하지 않을 것이라고 생각한다. – Orgrim

관련 문제