Properties クラスは、システムやアプリケーションに固有の情報を、記録する
のに用いられます。たとえば、Java のclass path の値や、アプリケーションの
バージョン、あるいは、ユーザ名、ユーザのホーム・ディレクトリ等といった
システム情報を知るためには、System クラスのProperties にアクセスする必要が
あります。
UNIXでは、環境変数やシェル変数がそうした役割を果たします。Java には、実は、 UNIX等の環境変数の値を取得する getenv()というメソッドがあるのですが、今では、 この方法ではなく、Propertiesを使うことが勧められています。 全てのOSが、環境変数やシェル変数といった機能を持つ保障はないからです。
次のコードは、System クラスのプロパティから、ユーザの名前とユーザのホーム・ ディレクトリを取得して、それを表示するプログラムの一部です。
System.out.println("User name: " + System.getProperty("user.name")); System.out.println("User home: " + System.getProperty("user.home"));
メソッド getProperty() の引数に与えられているのを、プロパティの「キー」
と呼びます。メソッド getProperty() は、このキーに対応する値を返します。
このように、プロバティは、「キー」と「値」の組から出来ています。
プロパティの「キー/値」のいずれとも、String 型であることに、
注意して下さい。
以下に、Systemクラスの代表的なプロパティのキーとその意味を次にあげておきます。
"file.separator" ......... ファイルの区切り文字(UNIXなら、'/') "java.class.path" ........ Java クラスパス "java.class.version" ...... Java クラスのバージョン "java.home" .............. Java がインストールされているディレクトリ "java.vendor.url" ........ Java ベンダのURL "java.version" ........... Java のバージョン "line.separator" ......... 行の区切り "os.arch" ................ OSのアーキテクチャ "os.name" ................ OS名 "path.separator" ......... パスの区切り(':') "user.dir" ............... カレント・ディレクトリ "user.home" .............. ユーザのホーム・ディレクトリ "user.name" .............. ユーザ名
System プロパティについては、一挙にプロパティを全て取得する、getProperties() というメソッドがあります。これと、プロパティを全て表示するlist()というメソッド を組み合わせると、次のような簡単なプログラムで、System プロパティの値を知る ことが出来ます。その出力もあわせて記しておきます。
$ cat systemProps.java import java.util.*; class systemProps { public static void main( String argv[]){ System.getProperties().list(System.out); } } $ java systemProps -- listing properties -- java.home=/usr/local/java java.version=1.0.2 file.separator=/ line.separator= java.vendor=Sun Microsystems Inc. user.name=maru os.arch=r4000 os.name=UX/4800 java.vendor.url=http://www.sun.com/ user.dir=/tmp_mnt/home/net/www1/star/maruyana/... java.class.path=.:/usr/local/java/lib:/usr/local/java... java.class.version=45.3 os.version=Release11.4 Rev.D path.separator=: user.home=/home/maruyama
System のプロパティは、Util パケッージで定義されているプロパティとは、
getProperty や list といったメソッドの名前やその働きは、ほとんど同じなのですが、
違うものとして設計されています。
System プロパティは、ユーザは読むだけで、値の設定は出来ません。
セキュリティの関係で、appletからは、読むことも制限されるものもあります。
一方、Util PackageのPropertyの方は、ユーザなり、サイトなりの環境設定を
自由に行うことが出来ます。とはいっても、ユーザ・プロパティにしても、
値の「設定」は、ファイルを通じてしか行うことは出来ません。
これは大事なことなのですが、ユーザは、プロパティの値をプログラムの中で
変更することは出来ず、ユーザに可能なことは、プロパティの名前と値を定義した
ファイルを作成することと、そのファイルをプログラム中で読みだして、定義された
プロパティを利用することだけです。
プロパティは、プログラムからみていつも同じ情報を提供し、プログラム中で 変化することはありません。プロパティが、Persistent と呼ばれるのは、 こうした意味からです。
プロパティ・クラスを利用すると、コンピュータが動作している時に、初めて意味を 持つ、システムないしはアプリケーションの実行環境を、システムやアプリケーション の実行が終了した後でも保存し、再度、環境を復元することが可能となります。
プロパティ・クラスには、プロパティをファイルに保存する save 、ファイルから プロパティを復元する load といったメソッドが用意されています。 次の props.java を見て下さい。
import java.io.*; import java.util.*; class props { public static void main( String argv[]){ try { Properties appP = new Properties() ; FileInputStream appS = new FileInputStream( "app.setting"); appP.load(appS); Properties siteP = new Properties(appP) ; FileInputStream siteS = new FileInputStream( "site.setting"); siteP.load(siteS); Properties userP = new Properties(siteP) ; FileInputStream userS = new FileInputStream( "user.setting"); userP.load(userS); userP.list(System.out); FileOutputStream saveS = new FileOutputStream( "user.save"); userP.save(saveS,"--- User Properties ---"); } catch( Exception e){ System.err.println(e); } } }
このコードは、あるアプリケーションを、アプリケーション・サイト・ユーザの
三つのレベルでコンフィグすることを想定して、その骨組みを書いてみたものです。
ここでは、引数付きの方の Properties コンストラクタに注目してください。
たとえば、 Properties siteP = new Properties(appP) ;
では、
siteP というプロパティが作られているのですが、そのデフォールトの値は、
appPというプロパティから作られます。appPとsitePに、同一のプロパティが存在
すれば、もちろん、load()で新しく読み込まれた値がデフォールトの値に置き
換わります。
この例で userP.list(System.out);
の出力は、三つのファイルの設定を
重ね合わせたものになるのですが、
userP.save(saveS,"--- User Properties ---");
で出力されるファイル
の内容は違います。この時は、なにが出力されるかは、実際に試してみてください。