2012-03-03 74 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和stdout?

感謝, JJ

回答

2

不要使用那些BufferedReader秒;他們正在緩衝數據(當然),這意味着將其存儲起來,而不一定馬上傳送。如果您只是使用它們,那麼您可以使用readLine(),傳遞0的第二個構造方法參數,它基本上將緩衝關閉。

另請參閱@ JonSkeet關於同時在後臺閱讀展位stdout和stderr的回答。

2

你想讀所有標準輸出 - 這基本上會阻塞,直到進程完成 - 然後所有標準錯誤。

使用兩個線程,一個讀取標準輸出和一個讀取標準錯誤 - 這種方式無關緊要哪個「下一個」有數據,您將從兩個線程讀取數據。

相關問題