2009-08-09 3 views

答えて

10
Process p = Runtime.getRuntime().exec("executable.exec"); 

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

String line; 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
+1

おそらく入力の代わりにgetOutputStreamまたはgetErrorStreamからストリームを読みたいと思うでしょう。 – JtR

+0

入力ストリームにする必要があります。そのような命名規則。 –

+3

おそらく、最後にp.waitFor()などを追加する必要がありますか? –

0

あなたはplexus-utilsからコマンドラインのタイプを使用する場合は、例えば、コマンドラインの相互作用に関連した重い物を持ち上げるの多くを回避することができますプロセスを待っている、引数をエスケープしているなど必要に応じてタイムアウトするようにコマンドを設定することもできます。

StreamConsumerを渡してstdoutとstderrをキャプチャできます。コマンドライン処理では、一度に1行ずつコンシューマに出力を渡します。

Commandline cl = new Commandline(); 

cl.setExecutable("dir"); 

cl.setWorkingDirectory(workingDirectory.getAbsolutePath()); 

cl.createArg().setValue("/S"); 

StreamConsumer consumer = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

StreamConsumer stderr = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

int exitCode; 

try { 
    exitCode = CommandLineUtils.execute(cl, consumer, stderr, getLogger()); 
} catch (CommandLineException ex) { 
    //handle exception 
} 
0

ブロッキングを防ぐために、stdoutとstderrを同時に使用する必要があることに注意してください。詳細はthis answerを参照してください。

stderrではなくstdoutを取得するだけで、離れていくことができます。しかし、いくつかのシナリオで.exeがエラーを生成した場合、親プロセスは余分な(予想外の)ストリームデータをブロックできます。ストリームの収集を同時に実行することが常にベストです。

関連する問題