2012-11-22 2 views
0

모두, 표준 출력과 로그/오류/예외 출력을 하위 프로세스에서 가져와야하는 프로세스가 있습니다. 표준 출력은 괜찮지 만 ErrorStream을 얻을 수 없기 때문에 프로그램이 거기서 멈춰 있습니다. 여기 간단한 코드가 있습니다. 마술은 없지만 왜 여기서 오류 스트림을 얻을 수 없습니까? 그것을 보아 주셔서 감사합니다.Java Process가 ErrorStream 메시지를받을 수 없습니다.

BufferedReader standard = 
     new BufferedReader(new InputStreamReader(process.getInputStream())); 

    BufferedReader error = 
    new BufferedReader(new InputStreamReader(process.getErrorStream())); 

    String line = null; 
    while ((line = standard.readLine()) != null) {    
     System.out.println(line); 
    } 
    while ((line = error.readLine()) != null) {   
     System.out.println(line); 
    } 

이제 제안 된 것처럼 출력과 오류 스트림을 처리하기 위해 두 개의 스레드를 사용했지만 다음과 같이 여전히 동일한 문제가있었습니다. 아무도 통찰력을 줄 수 없나요? 감사.

ProcessBuilder pb = new ProcessBuilder(listArgs); 
    pb.redirectErrorStream(); 
    Process process = pb.start(); 

    StreamThread output = new StreamThread(process.getInputStream()); 
    StreamThread error = new StreamThread(process.getErrorStream()); 

    output.start(); 
    error.start(); 
    while (true) { 
     try { 
      output.join(); 
      break; 
     } 
     catch (InterruptedException ie) { 
      ie.printStackTrace(); 
     } 
    } 

StreamThread의 정의 : 당신의 루프에서

public static class StreamThread extends Thread{ 
    private InputStream input = null; 
    public StreamThread(InputStream in){ 
     input = in; 
    }  
    String line = null; 
    public void start(){    
     BufferedReader reader = new BufferedReader(new InputStreamReader(input));   
     try{ 
      while((line=reader.readLine()) != null){ 
       System.out.println(line); 
      } 
      reader.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

답변

1

봐 : 당신은 그것을이 완료 될 때까지 출력 스트림에서 읽기 계속거야

while ((line = standard.readLine()) != null) {    
    System.out.println(line); 
} 
while ((line = error.readLine()) != null) {   
    System.out.println(line); 
} 

- 가능성이있는 프로세스가 종료되는 시점 다음 오류 스트림을 읽기 시작합니다.

이 중 하나 이상을 다른 스레드에 넣어야하므로 두 스트림을 동시에 읽을 수 있습니다. 스트림.

+0

의견을 보내 주셔서 감사합니다.하지만 의견을 잘 이해하지 못합니다. 첫 번째 while 루프의 끝에서 출력 스트림 읽기가 완료되지 않았습니까? – user697911

+0

@ user697911 : 네, 그런 일이 언제 일어날 것으로 예상합니까? 일반적으로 프로세스는 완료 될 때까지 출력 스트림을 열린 상태로 유지합니다 (따라서'readLine' 블록을 만듭니다). –

+0

그래서,이 도움이되지 않습니까? 나는 시도했다, 그것은 닫히지 않는다. while ((line = standard.readLine())! = null) { System.out.println (line); } standard.close(); – user697911

관련 문제