JAva.util.Propertiesクラスの使用


Propertiesクラスはもう新しいものではありません.Javaプログラミングの初期にあり、ほとんど変わっていません.J 2 SEのTigerバージョンでは、このクラスが強化されています.このクラスでは、等号で区切られた複数のキー値ペアだけでなく、XMLファイルでキー値ペアをロードおよび保存することもできます.Tigerを飼い慣らすこの文章では、John Zukowskiがこの新世代の「役馬」をどのように制御するかを示している.
    J 2 SE 1.5以前のバージョンでは、XML解析器を直接使用してプロファイルをロードし、設定を保存する必要がありました.これは困難なことではなく、解析器はプラットフォームの標準的な部分ですが、追加の仕事はいつも煩わしいです.最近更新されたjava.util.Propertiesクラスでは、loadFromXML(InputStreams)メソッドとstoreToXML(OutputStreamos,String comment)メソッドのプログラムのマウントとストレージの設定が容易になりました.
Propertiesの基本知識
Java.util.Propertiesクラスに詳しくない場合は、リスト1に示すように、キーと値が等号で区切られたファイルにキー-値ペアを格納するために使用されていることを示します.
インベントリ1.属性のセットの例
foo=bar
fu=baz
リスト1をPropertiesオブジェクトにロードすると、2つのキー(fooとfu)と2つの値(fooのbarとfuのbaz)が見つかります.このクラスはu付き埋め込みUnicode文字列をサポートしていますが、ここでは各コンテンツがStringとして扱われることが重要です.
インベントリ2には、プロパティ・ファイルをロードして現在のキーと値のセットを並べ替える方法が表示されます.このファイルのInputStreamをload()メソッドに渡すだけで、各キー値ペアがPropertiesインスタンスに追加されます.次にlist()ですべてのプロパティをリストするか、getProperty()で個別のプロパティを取得します.
インベントリ2.ロード属性

import java.util.*;
import java.io.*;

public class LoadSample {
    public static void main(String args[]) throws Exception {
      Properties prop = new Properties();
      FileInputStream fis = 
        new FileInputStream("sample.properties");
      prop.load(fis);
      prop.list(System.out);
      System.out.println("
The foo property: " + prop.getProperty("foo")); } }

LoadSampleプログラムを実行して、リスト3に示すような出力を生成します.注意list()メソッドの出力におけるキー値ペアの順序は、入力ファイルの順序とは異なります.Propertiesクラスは、ハッシュ・リスト(hashtable、実際にはHashtableサブクラス)にキー値ペアのセットを格納するので、順序を保証することはできません.
インベントリ3.LoadSampleの出力
-- listing properties --
fu=baz
foo=bar
The foo property: bar
XMLプロパティファイル
ここには新しい内容はありません.Propertiesクラスはいつもこのように働いています.ただし、新しい場所は、XMLファイルからプロパティのセットをロードすることです.そのDTDをリスト4に示す.
インベントリ4.属性DTD
dtdは
<?xml version="1.0" encoding="UTF-8"?> 
<!-- DTD for properties --> 
<!ELEMENT properties ( comment?, entry* ) > 
<!ATTLIST properties version CDATA #FIXED "1.0"> 
<!ELEMENT comment (#PCDATA) > 
<!ELEMENT entry (#PCDATA) > 
<!ATTLIST entry key CDATA #REQUIRED>

XML DTDを詳しく読みたくない場合は、外周ラベルにはラベルが包装されており、その後は任意の数のラベルが包装されていることを示します.各ラベルには、キープロパティがあり、入力された内容がその値です.インベントリ5は、インベントリ1の属性ファイルのXMLバージョンがどのようになっているかを示している.
インベントリ5.XMLバージョンのプロパティファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Hi</comment>
<entry key="foo">bar</entry>
<entry key="fu">baz</entry>
</properties>

リスト6に示すように、XMLバージョンを読み込むPropertiesファイルは、古いフォーマットを読み取るファイルと変わらない.
インベントリ6.XML Propertiesファイルの読み込み
import java.util.*;
import java.io.*;

public class LoadSampleXML {
    public static void main(String args[]) throws Exception {
      Properties prop = new Properties();
      FileInputStream fis =
        new FileInputStream("sampleprops.xml");
      prop.loadFromXML(fis);
      prop.list(System.out);
      System.out.println("
The foo property: " + prop.getProperty("foo")); } }

リソースバインドの説明
Java.util.Propertiesクラスでは、キー-値ペアのほかに、属性ファイルをXMLファイルとしてサポートしていますが、残念ながらResourceBundleをXMLファイルとして処理するオプションは組み込まれていません.はい、PropertyResourceBundleでは、Propertiesオブジェクトを使用してバインドをロードしませんが、ロードメソッドの使用は、新しいloadFromXML()メソッドではなく、クラスにハードコーディングされます.
実行リスト6のプログラムは、リスト2に示すように、元のプログラムと同じ出力を生成する.
XML属性の保存
新しいPropertiesには、XML形式のファイルに属性を格納する機能もあります.store()メソッドでは、リスト1に示すようなファイルが作成されますが、リスト5に示すようなファイルを新しいstoreToXML()メソッドで作成できます.OutputStreamとコメント用のStringを1つ渡すだけでいいです.インベントリ7は、新しいstoreToXML()メソッドを示している.
インベントリ7.PropertiesをXMLファイルとして保存する
import java.util.*;
import java.io.*;

public class StoreXML {
    public static void main(String args[]) throws Exception {
      Properties prop = new Properties();
      prop.setProperty("one-two", "buckle my shoe");
      prop.setProperty("three-four", "shut the door");
      prop.setProperty("five-six", "pick up sticks");
      prop.setProperty("seven-eight", "lay them straight");
      prop.setProperty("nine-ten", "a big, fat hen");
      FileOutputStream fos =
        new FileOutputStream("rhyme.xml");
      prop.storeToXML(fos, "Rhyme");
      fos.close();
    }
}

実行リスト7のプログラムによる出力をリスト8に示す.
インベントリ8.格納されたXMLファイル
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Rhyme</comment>
<entry key="seven-eight">lay them straight</entry>
<entry key="five-six">pick up sticks</entry>
<entry key="nine-ten">a big, fat hen</entry>
<entry key="three-four">shut the door</entry>
<entry key="one-two">buckle my shoe</entry>
</properties>

終わりの言葉
XMLファイルを使用するか、古いa=bタイプのファイルを使用するかは、あなた自身次第です.古いファイルはメモリの観点から軽量級に違いない.しかし、XMLの一般的な使用により、広く使用されているため、XMLフォーマットが流行することが期待されますが、Propertiesオブジェクトは使用されていません.選択は完全にあなたにあります.パッケージprivate XMLUtilsクラスのソースコードを解析し、使用するXML解析の詳細を取得します.
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
*   properties     
* @author bbflyerwww
* @date 2006-08-02
*/
public class PTest {
      public static void main(String[] args) {
          try {
              long start = System.currentTimeMillis();
              InputStream is = new FileInputStream("conf.properties");
              Properties p = new Properties();
              p.load(is);
              is.close();
              System.out.println("SIZE : " + p.size());
              System.out.println("homepage : " + p.getProperty("homepage"));
              System.out.println("author : " + p.getProperty("author"));
              System.out.println("school : " + p.getProperty("school"));
              System.out.println("date : " + p.getProperty("date"));
              long end = System.currentTimeMillis(); 
              System.out.println("Cost : " + (end - start));
          } catch (IOException ioe) {
              ioe.printStackTrace();
          }
      }
}

conf.properties
# Configuration fileauthor = bbflyerwww
school = WuHan University
date = 2006-08-02

Result
SIZE:4
author : bbflyerwww
school : WuHan University
date : 2006-08-02
Cost : 0