next up previous contents
Next: Hashtable Up: Utility classes Previous: Utility classes

Properties

Properties クラスは、システムやアプリケーションに固有の情報を、記録する のに用いられます。たとえば、Java のclass path の値や、アプリケーションの バージョン、あるいは、ユーザ名、ユーザのホーム・ディレクトリ等といった システム情報を知るためには、System クラスのProperties にアクセスする必要が あります。

UNIXでは、環境変数やシェル変数がそうした役割を果たします。Java には、実は、 UNIX等の環境変数の値を取得する getenv()というメソッドがあるのですが、今では、 この方法ではなく、Propertiesを使うことが勧められています。 全てのOSが、環境変数やシェル変数といった機能を持つ保障はないからです。

key/value

次のコードは、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 Property と User Property

System のプロパティは、Util パケッージで定義されているプロパティとは、 getProperty や list といったメソッドの名前やその働きは、ほとんど同じなのですが、 違うものとして設計されています。 System プロパティは、ユーザは読むだけで、値の設定は出来ません。 セキュリティの関係で、appletからは、読むことも制限されるものもあります。

一方、Util PackageのPropertyの方は、ユーザなり、サイトなりの環境設定を 自由に行うことが出来ます。とはいっても、ユーザ・プロパティにしても、 値の「設定」は、ファイルを通じてしか行うことは出来ません。 これは大事なことなのですが、ユーザは、プロパティの値をプログラムの中で 変更することは出来ず、ユーザに可能なことは、プロパティの名前と値を定義した ファイルを作成することと、そのファイルをプログラム中で読みだして、定義された プロパティを利用することだけです。

プロパティは、プログラムからみていつも同じ情報を提供し、プログラム中で 変化することはありません。プロパティが、Persistent と呼ばれるのは、 こうした意味からです。

save()/load()

プロパティ・クラスを利用すると、コンピュータが動作している時に、初めて意味を 持つ、システムないしはアプリケーションの実行環境を、システムやアプリケーション の実行が終了した後でも保存し、再度、環境を復元することが可能となります。

プロパティ・クラスには、プロパティをファイルに保存する 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 ---");で出力されるファイル の内容は違います。この時は、なにが出力されるかは、実際に試してみてください。



maruyama@wakhok.ac.jp