2012-03-03 8 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 Sを使用しないでください。彼らはそれを格納し、必ずしもすぐにそれを渡すことを意味しないデータを(もちろん)バッファリングしています。 readLine()を使用できるようにそれらを使用している場合は、2番目のコンストラクタ引数0を渡します。これは基本的にバッファリングをオフにします。

また、ブースのstdoutとstderrをバックグラウンドで同時に読むことについての@ JonSkeetの回答を参照してください。プロセスが終了するまで、基本的にブロックされる - -

2

あなたは標準出力のすべてを読み取ろうとしているとstderrの後、すべて

stdoutからの読み取りとstderrからの読み取りの2つのスレッドを使用します。どちらのスレッドにデータがあるかは関係ありません。両方のスレッドから読み取ることになります。

関連する問題