2012-03-29 4 views
0

私は、実行可能ファイルを呼び出してその出力を処理させるメッセージをキューに入れて、連続的に実行するプロセスを作成しています。私はそれを呼び出すためにRuntime.getRuntime()。exec()を使用していますが、私は出力を初めて取得しています。問題をより簡単に表示するために、私はそれをループに入れました。私は 'seq 1 5'を別の行にそれぞれ1〜5の数字を表示する実行可能ファイルのスタンドインとして使用しています。 (私は、Mac 10.7とFedora 14の両方でそれを実行している)。ここループでRuntime.getRuntime()。exec()を呼び出すとき、最初の呼び出しではなく出力を生成するためにどのように呼び出すことができますか?

public static void main(String args[]) { 
    for (int i = 0; i < 4; i++) { 
     try { 
      Process process = Runtime.getRuntime().exec("seq 1 5"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
      while (reader.ready() || errReader.ready()) { 
       if (reader.ready()) { 
        System.out.println("Process output: " + reader.readLine()); 
       } 
       if (errReader.ready()) { 
        System.err.println("Process error: " + errReader.readLine()); 
       } 
      } 
      reader.close(); 
      errReader.close(); 
      int result = process.waitFor(); 
      if (result != 0) { 
       System.err.println("Process returned with result " + 0); 
      } 
      System.out.println("Finished process for iteration " + i); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

は結果である - あなたは、プロセスの予想される出力は、最初のループで発生見ることができます:時々

Process output: 1 
Process output: 2 
Process output: 3 
Process output: 4 
Process output: 5 
Finished process for iteration 0 
Finished process for iteration 1 
Finished process for iteration 2 
Finished process for iteration 3 

おそらく10回の実行のうち1回、後の反復のうちの1つが出力を印刷しますが、決してすべてを出力することはありません。明らかに正しくクリーンアップされていないものがなければならないので、最初のexec()を除いたすべてが誤動作することになりますが、何ができるのか分かりません。入力ストリームは両方とも閉じます。

答えて

1
import java.io.*; 
public class TP { 
    public static void main(String... argv) { 
     ProcessBuilder pb = new ProcessBuilder(argv); 
     for (int i = 0; i < 4; i++) { 
      try { 
       Process process = pb.start(); 
       int result = process.waitFor(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
       BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
       while (reader.ready() || errReader.ready()) { 
        if (reader.ready()) { 
         System.out.println("Process output: " + reader.readLine()); 
        } 
        if (errReader.ready()) { 
         System.err.println("Process error: " + errReader.readLine()); 
        } 
       } 
       reader.close(); 
       errReader.close(); 
       if (result != 0) { 
        System.err.println("Process returned with result " + result); 
       } 
       System.out.println("Finished process for iteration " + i); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 
+0

に来るようDataFetcher付きビュー=ログ)

、あなたが通知を得るためにFetcherListenerを追加することができ、あなたのコードからわずか2変更a)に使用ProcessBuilderをb)は出力を読み取る前のwaitForを呼び出します。 。確認するには、 'java TP 1として実行してください。5 –

+0

Hey-o! waitFor()を出力読み取りセクションの上に移動することがキーでした。どうもありがとう! – mongiesama

+0

これはおそらくこのような小さな入力のために働くかもしれませんが、waitForはブロックされた呼び出しで、起動したプロセスの終了前に入力を読み取らないことを意味します。ストリームの読み込みは、適切な並行性を可能にする第2のスレッドに移行することができます。 –

0

現在のスレッドで実行されるBufferedReaderを使用するのではなく、DataFetcher(http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/io/DataFetcher.java)のようなスレッドリーダーを使用することができます。 ?新しいデータが

関連する問題