8-3-1:システムの情報を得る


・ システムに関する情報を得るための手段について調べてみましょう。 最も一般的に利用されるのがシステムのプロパティ(property)を介する方法です。 プロパティは特定の情報のデータとデータを指定するためのキーの組から構成されます。 適当なキーを指定することで目的のデータを取り出すことができます。 プロパティを取り扱うためのクラスが java.util.Properties です。 Propertiesのオブジェクトは、 複数のデータを集めた「2次元の表」だと考えればよいでしょう。 JVMは システムに関する情報を記憶した Propertiesのオブジェクトを保有しています。 これにアクセスするための手段は Systemクラスが提供します。 個々のプロパティについての情報は getProperty()メソッドによって、 システムのプロパティ全体は getProperties()メソッドで得ることができます。 システムのプロパティをすべて得るためのサンプル PrintEnv.java を紹介しましょう。
 Javaで開発されたアプリケーションが システムや実行環境の違いに依存しないようにするためにも、 プロパティの情報は重要です。 たとえばファイルのパス名の区切りの文字を得るための "file.separetor"は UNIXならば "/" を、 Windows ならば "\" を与えます。 同様に改行の文字を得る "line.separetor" も システムによる違いを吸収する目的でしばしば利用されます。
 システムのプロパティの個数やサポートするキーの名称も、 一般に VMのバージョンやシステムによって異なります。 ユーザー名の情報を得るための "user.name" や ユーザーのホームディレクトリを表す "user.home"のように、 あるシステムでは意味のある情報を与えても、 他のシステムでは値を持たない場合もあります。 プログラムを実行してみて、 あなたのシステムではどんなプロパティが定義されているか調べてみてください。
 なお上のサンプルでは不特定の個数のプロパティをループで取り扱うために java.util.Iteratorのオブジェクトが利用されています。 (正確には Iteratorはインターフェイスでオブジェクトの実体のクラスは 別に定義されています。) Iteratorは JDK1.1までの java.util.Enumeration と同じ機能を提供する新しいインターフェイスです。 Iteratorは複数のデータをまとめて取り扱う点では配列と共通しています。 ただしインデックス番号は持たず、 単に次の要素を順番に指定していくことで、すべての要素をたどっていきます。

・ システムのプロパティを通じる以外にも、 システムから必要な情報を取得する手段が存在します。 特に重要なクラスが java.lang パッケージの Runtime という名前のクラスです。 System が JVMそのものを表すクラスとするならば、 Runtime は JVMが利用している外部のシステムを表すクラスです。 通常は Systemのメソッドとして呼び出される exit()や gc()などの処理も、実は最終的には Runtimeのオブジェクトによって 処理されます。

・

 Runtime と Systemのように2重構造が存在するのは、 アプリケーションのシステムへの依存性を覆い隠すための工夫です。 したがって必要な機能が Systemクラスによって得られる場合は、 できるだけそちらを使用すべきです。 もちろん Runtimeに直接アクセスしなければならないケースもあります。 その典型が メモリの使用状況を調べるサンプル MemoryCheck.javaです。

 Runtimeの freeMemory()メソッドおよび totalMemory()メソッドによって、 アプリケーションおよびシステムによって利用可能なメモリの量を知ることが可能です。 これらはシステムの生の数値ですから、 上のサンプルの実行結果は当然マシンやシステムの種類によってかなり異なる結果に なるでしょう。