2

Javaからコマンドラインアプリケーション(呼び出しましょうSomeTerminalApp)を呼び出そうとしています。より正確には、次のようになります。

  1. JavaはSomeTerminalAppを起動します
  2. SomeTerminalAppは、Javaが提供するユーザー入力を要求します
  3. SomeTerminalAppは入力を処理し、しばらくすると出力を表示して新しいユーザー入力を要求します。
  4. Javaはこれを検出し、SomeTerminalAppの出力を処理し、おそらく以前の出力に基づいて、新しいユーザー入力を挿入します。
  5. 手順3〜4は、任意の回数繰り返されます(出力に応じて、Javaの停止条件が満たされるまで)
  6. これで完了です。JavaはSomeTerminalAppを閉じて、自身のビジネスを再び考えます。

これをどのように行うのが最善ですか?現在、私は非常に素朴なプロセス処理を取得しました

Process p = Runtime.getRuntime().exec("/path/SomeTerminalApp -q"); //run in quiet mode
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

入力を挿入し、固定数の出力行をすぐに読み取る機能を備えています。

public ArrayList<String> exec (ArrayList<String> input, int nrOfOutputLines) {
    for (int i=0; i<input.size(); i++) bw.write(input.get(i)+"\n");
    bw.flush();
    ArrayList<String> output = new ArrayList<String>();
    for (int i=0; i<nrOfOutputLines; i++) output.add(br.readLine());
    return output;
} 

残念ながら、何行読む必要があるかわからないことがよくあります(出力は不明であり、自動的に多くの行に分割されるため)。また、出力がすぐに届かないこともあります(ミリ秒からかかる場合があります)。出力が表示されるまでの日数)。

このようなプロセスを適切に処理するにはどうすればよいですか。つまり、プロセスが処理を終了したときにリッスンし(固定タイマーを設定したり、タイマーを設定しなかったりするだけでなく)、生成されたすべての出力を最新のコマンドへの応答として読み取ります(最後のN行だけではありません)。固定数N)?

4

1 に答える 1

2

あなたは正しい考えを持っています。サブプロセスがいつ完了したかを知る簡単な方法はありません。アイドル状態になる前の最後のアクションとして認識可能なもの (「完了」など) を出力するか、終了する必要があります (入力時に EOF として検出できます)。

于 2012-09-22T04:15:24.340 に答える