ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

java.lang.ProcessBuilder

昨日くらいから、ようやくJDK1.5というか、Java2SE5.0というか、JavaSE5.0を触っているのですが、拡張forループとか、AutoBoxingとか、Genericsとか、可変引数とか、まあ確かにあったら便利だよねっていう機能が満載になっているようです。
そんな中、ちょっといいなぁと思った機能がProcessBuilderだったりします。まあ、正直地味なところではあるのですが(汗 JDK1.4以前ではjava.lang.Runtimeを使って、以下のようなコードを書く必要がありました。

Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[] {"ping", "localhost"});
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String buf;
while((buf = reader.readLine()) != null)
{
}

コマンドと引数を同じString配列に詰めて渡したりするのもなんとなくヘンですが、なんと言ってもやっかいなのが、コマンドの出力を読み込んであげないと正しく実行されないことです。まあ、普通の人は「なんでこんな面倒なことを。。」と思う前に、さくっと共通化してしまうところなのでしょうが、たまたまプロトタイプで何かを作りたいときに、非常にイライラさせられたりします。そこでProcessBuilderの登場ってわけなんですが、こいつはこんな感じで使えます。

ProcessBuilder pb = new ProcessBuilder("ping", "localhost");
Process p = pb.start();

こいつは可変引数にも対応しているので、コマンド名以下引数をずらずら書いていくだけでオッケーです。たった二行でコマンドの実行ができます。もちろんコマンドの出力結果をとりたければ、Process#getInputStreamで取得することも可能です。