2012-03-03 1 views
0
내가 다음 코드 한

:실시간으로 Runtime.exec에서 stdout 및 stderr을 얻는 방법은 무엇입니까?

Process runJob = null; 
    try { 
     runJob = Runtime.getRuntime().exec(args); 

    InputStream cmdStdErr = null; 
    InputStream cmdStdOut = null; 

    cmdStdErr = runJob.getErrorStream(); 
    cmdStdOut = runJob.getInputStream(); 


    String line; 
    BufferedReader stdOut = new BufferedReader (new InputStreamReader (cmdStdOut)); 
    while ((line = stdOut.readLine()) != null) { 
     logger.info(line); 

    } 

    cmdStdOut.close(); 

    // send error to Ab Initio and exit 
    BufferedReader br = new BufferedReader(new InputStreamReader(cmdStdErr)); 
    String errMsg=""; 
    while ((line = br.readLine()) != null) { 
     logger.info(line); 
     errMsg += line; 

    } 
    cmdStdErr.close(); 

    res = runJob.waitFor(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

문제는 작업이 실행되는 경우는 표준 출력을위한 출력 만의 InputStream을 많이 생산 및 stderr 작업이 수행 된 후에 만 ​​출력을 인쇄한다는 것입니다.

실시간으로 출력을 얻을 수있는 방법이 있습니까? 예를 들어 작업이 출력 할 때 표준 오류 및 표준 출력을 얻는 방법이 있습니까?

감사합니다,

답변

2

BufferedReader의 사용하지 마십시오 JJ; 그들은 데이터를 버퍼링하고 있습니다. 물론 데이터를 저장하는 것이지 반드시 필연적으로 전달하는 것은 아닙니다. 방금 readLine()을 사용할 수 있도록 방금 사용하는 경우 0의 두 번째 생성자 인수를 전달합니다. 이는 기본적으로 버퍼링을 해제합니다.

백그라운드에서 동시에 부스 stdout 및 stderr을 읽는 것에 대한 @ JonSkeet의 답변을 참조하십시오. 프로세스가 완료 될 때까지 기본적으로 차단되는 - -

2

당신은 표준 출력의 모든을 읽을하려는 및 stderr의 다음 모든.

두 개의 스레드를 사용하십시오. 하나는 stdout에서 읽는 것이고 다른 하나는 stderr에서 읽는 것입니다. "다음"에 데이터가있는 것이 중요하지 않으므로 두 가지 모두에서 읽을 수 있습니다.