J2SE5.0(Tiger)には実に様々な言語レベルの機能追加がなされています。
メジャーなものは各誌で取り上げられている通りですが、中には地味だけ
れども結構役に立つ機能追加もあります。
Javaコードは極力OS依存させたくないわけですが、時にはOSコマンドを
叩かないといけないこともあります。そうした時に従来はRuntime.exec()
メソッドを使うのが一般的でした。一応、このメソッドで一通りのことは
できるのですが、環境変数を指定する時にはkey=valueのフォーマットで
変数名と値のペアを整形した上で、それらをStringの配列として引数に
渡す必要がありました。ちょっとしたコマンド実行のためにわざわざ配列
を作るのが少々面倒でした。
Tigerでは新たにjava.lang.ProcessBuilderというクラスが追加されています。
これはOSネイティブのコマンドをある意味ラッピングしてしまって、環境変数の
指定やカレントディレクトリの切り替えといったプロセス実行環境の操作を容易
にしてくれるものです。このクラスのenvironment()というメソッドは環境変数
を格納したMapを返します。このマップに設定したい環境変数のペアを追加して
あげれば、それがプロセス実行時に反映されます。ちなみにプロセスの実行は
start()メソッドを使います。同時にSystem.getenv()というメソッドもSystem
クラスに追加されており、これは現在の環境変数を格納したMapを返します。
(従来は特定の環境変数の値のみを返す System.getenv(String name)しかあり
ませんでした)このSystem.getenv()メソッドとProcessBuilderを併用すれば
従来よりもだいぶ楽にOSネイティブコマンドの実行ができるようになります。
J2SE5.0のAPI仕様書を見てもRuntime.exec()より、ProcessBuilderを使う方
が望ましいと記載されています。ですが、ProcessBuilderはシンクロナイズさ
れませんので、その点は注意する必要がありそうです。