2010-01-05 8 views
3

Java를 사용하여 GUI를 만들고 있습니다. 이 GUI는 ProcessBuilder 클래스를 사용하여 명령 행에서 프로그램을 시작합니다.다른 프로그램의 출력을 자바 텍스트 영역에 인쇄

실행중인 프로세스에 대한 정보가 거의 없습니다. 명령 줄에서 다른 창을 만들고 해당 창에 정보를 인쇄합니다.

제 GUI 창에서 출력물을 리디렉션 할 텍스트 영역이 있습니다. 원래 SwingWorker 객체를 사용하여 더 많은 출력을 지속적으로 확인하고 GUI를 유지하려고하지 않았습니다. 테스트하고 내가 원래 구문을 가지고 있는지 확인하기 위해 (심지어 GUI를 사용하지 않고) 보조 프로세스의 출력을 System.out으로 출력한다고 생각했습니다. 그러나 2 차 프로세스 '창에서 결과를 볼 수 있지만 작업중인 터미널은 볼 수 없으므로 문제가있는 것으로 보입니다. 다음과 같이 코드의

발췌은 다음과 같습니다

Process p = pb.start(); 
Scanner s = new Scanner(p.getInputStream()); 

SwingWorker pipe = new SwingWorker<String, Void>(){ 
    public String doInBackground(){ 
     while(run){ 
      if(s.hasNextLine()){ 
       System.out.println("S has next!"); 
       System.out.println(s.nextLine()); 
      } 
     } 
     return null; 
    } 
}; 
pipe.execute(); 

부울 실행 프로그램의 다른 곳에서 정의되며, 프로세스 P가 종료되거나 힘이 종료 할 때 false로 설정 (추가 질문 : 정말 나쁜 것입니다 아이디어? 나는 그것이있을 것 같은 느낌이 든다. ..).

다른 사람에게 출력되는 것을 본 적이없는 이유는 누구입니까? 처음에는 p.getOutputStream()을 사용했지만 Scanner는 outputStream을 매개 변수로 사용하지 않았습니다.

감사합니다.

답변

3

p.getErrorStream()도 스캔해야합니다. 명령 줄에서 실행할 때 STDOUT과 구별 할 수없는 일부 프로그램은 STDERR에 쓰기도합니다. 일반적으로 두 스트림을 모두 소비하는 것이 좋으며, 두 스트림 중 하나를 사용하지 않으면 외부 프로세스가 중지 될 수 있습니다.

+0

실제로 프로그램이 창에 인쇄하고있는 모든 것이 실제로 STDERR로 인쇄되고있는 것으로 나타났습니다. 흥미 롭 군. 감사! – RCC

2

외부 프로세스가 자신의 출력을 자체 창에 쓰는 경우 출력이 STDOUT에 쓰여져 있지 않은 것이 거의 확실합니다. 이것은 코드로 읽은 것입니다. 그렇게하면 외부 프로그램의 출력이 창과 명령 줄 세션에서 모두 표시됩니다 (존재하는 경우). 외부 프로그램 소스에 액세스하지 않으면 작성자가 해당 기능에 대한 조항을 만든 경우가 아니라면 출력을 가로 챌 수는 없습니다 (예 : 창 대신 출력을 STDOUT으로 리디렉션하는 명령 줄 스위치).

p.getOutputStream()에 대해서는 YOUR의 관점에서 "출력"되는 스트림을 반환합니다. 즉, STDIN 프로세스로 데이터를 보내기 위해 스트림에 출력합니다. p.getInputStream()을 사용하면 외부 프로그램이 STDOUT에 쓰는 경우에 적합합니다.

+0

아하 ... 명령 줄에서 시작한 창이이 다른 프로세스에서 실행 된 다른 터미널 창인 경우에도 출력이 STDOUT이 아닙니까? 프로세스는 정보를 출력 파일 또는 창에 인쇄합니다. – RCC

+0

아마도 그렇습니다. 프로세스가 파일 또는 보조 창에 쓰는지 여부를 어떻게 제어합니까? 이것이 리눅스 인 경우'-'를 "STDOUT에 쓰기"를 의미하는 출력 파일로 이해할 가능성이 있으며이 경우 사용자 코드를 사용할 수 있습니다. –

+0

불행히도 Windows입니다. 프로그램 자체는 명령 줄에서 호출 될 때 인수를 취하고 "output"키워드 다음에 쓸 파일 이름을 사용합니다. 프로그램이 윈도우에 쓰기로되어 있으면 사용자는 프로그램을 호출 할 때 출력 파일 이름을 생략합니다. – RCC

관련 문제