歡迎光臨郝學(xué)武的blog。

          淺談java.util.Properties

          Posted on 2008-05-15 17:41 陜西BOY 閱讀(2894) 評論(5)  編輯  收藏

                  以前寫連接池的時候就用過Properties,就知道怎么用,但是不是很明白它都做什么用!今天偶的空閑,在網(wǎng)上轉(zhuǎn)了轉(zhuǎn),收益不小,讓我對它有了進(jìn)一步的認(rèn)識。熟悉的就不用看了。
                  如果不熟悉 java.util.Properties 類,那么現(xiàn)在告訴您它是用來在一個文件中存儲鍵-值對的,其中鍵和值是用等號分隔的。(如清單 1 所示)。最近更新的 java.util.Properties 類現(xiàn)在提供了一種為程序裝載和存儲設(shè)置的更容易的方法: loadFromXML(InputStream is) 和 storeToXML(OutputStream os, String comment) 方法。

                   一下是詳細(xì)的說明,希望能給大家?guī)韼椭?br />
          清單 1. 一組屬性示例

          foo=bar
          fu=baz




          將清單 1 裝載到 Properties 對象中后,您就可以找到兩個鍵( foo 和 fu )和兩個值( foo 的 bar 和 fu 的 baz )了。這個類支持帶 \u 的嵌入 Unicode 字符串,但是這里重要的是每一項(xiàng)內(nèi)容都當(dāng)作 String 。

          清單 2 顯示了如何裝載屬性文件并列出它當(dāng)前的一組鍵和值。只需傳遞這個文件的 InputStream 給 load() 方法,就會將每一個鍵-值對添加到 Properties 實(shí)例中。然后用 list() 列出所有屬性或者用 getProperty() 獲取單獨(dú)的屬性。

          清單 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("\nThe foo property: " +
                  prop.getProperty("foo"));
            }
          }




          運(yùn)行 LoadSample 程序生成如清單 3 所示的輸出。注意 list() 方法的輸出中鍵-值對的順序與它們在輸入文件中的順序不一樣。 Properties 類在一個散列表(hashtable,事實(shí)上是一個 Hashtable 子類)中儲存一組鍵-值對,所以不能保證順序。

          清單 3. LoadSample 的輸出

          -- listing properties --
          fu=baz
          foo=bar

          The foo property: bar




          XML 屬性文件
          這里沒有什么新內(nèi)容。 Properties 類總是這樣工作的。不過,新的地方是從一個 XML 文件中裝載一組屬性。它的 DTD 如清單 4 所示。

          清單 4. 屬性 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>




          如果不想細(xì)讀 XML DTD,那么可以告訴您它其實(shí)就是說在外圍 <properties> 標(biāo)簽中包裝的是一個 <comment> 標(biāo)簽,后面是任意數(shù)量的 <entry> 標(biāo)簽。對每一個 <entry> 標(biāo)簽,有一個鍵屬性,輸入的內(nèi)容就是它的值。清單 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("\nThe foo property: " +
                  prop.getProperty("foo"));
            }
          }




          關(guān)于資源綁定的說明
          雖然 java.util.Properties 類現(xiàn)在除了支持鍵-值對,還支持屬性文件作為 XML 文件,不幸的是,沒有內(nèi)置的選項(xiàng)可以將 ResourceBundle 作為一個 XML 文件處理。是的, PropertyResourceBundle 不使用 Properties 對象來裝載綁定,不過裝載方法的使用是硬編碼到類中的,而不使用較新的 loadFromXML() 方法。


          運(yùn)行清單 6 中的程序產(chǎn)生與原來的程序相同的輸出,如 清單 2所示。

          保存 XML 屬性
          新的 Properties 還有一個功能是將屬性存儲到 XML 格式的文件中。雖然 store() 方法仍然會創(chuàng)建一個類似 清單 1 所示的文件,但是現(xiàn)在可以用新的 storeToXML() 方法創(chuàng)建如 清單 5 所示的文件。只要傳遞一個 OutputStream 和一個用于注釋的 String 就可以了。清單 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();
            }
          }




          運(yùn)行清單 7 中的程序產(chǎn)生的輸出如清單 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>
          在這里改了一個例子:
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.util.Properties;
          /**
           * 實(shí)現(xiàn)properties文件的讀取
           * @author  haoxuewu
           */
          public class Test {
              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"));
                      long end = System.currentTimeMillis(); 
                      System.out.println("Cost : " + (end - start));
                  } catch (IOException ioe) {
                      ioe.printStackTrace();
                  }
              }
          }

          conf.properties
          # Configuration file
          homepage = http://www.aygfsteel.com/haoxuewu
          author = bbflyerwww
          school = jilinjianzhugongchengxueyuan

          Result
          SIZE:3
          homepage : http://www.aygfsteel.com/haoxuewu
          author : bbflyerwww
          school : jilinjianzhugongchengxueyuan

          Cost : 0


           

          Feedback

          # re: 淺談java.util.Properties   回復(fù)  更多評論   

          2008-05-16 12:12 by 網(wǎng)上買書
          有原理有實(shí)力,真的很不錯

          # re: 淺談java.util.Properties [未登錄]  回復(fù)  更多評論   

          2008-05-16 14:12 by z
          s

          # re: 淺談java.util.Properties   回復(fù)  更多評論   

          2008-05-17 13:24 by 隔葉黃鶯
          XML 的方式?jīng)]用過,可能一種使用習(xí)慣吧,要說就那么簡單的鍵值對,又沒有層次關(guān)系,真用不著拿 XML 存儲的。就這么一個層次的 XML 讀起來要比 properties 文件費(fèi)勁的。

          # re: 淺談java.util.Properties   回復(fù)  更多評論   

          2008-05-17 22:59 by haoxuewu
          Properties不過是提供這樣一個接口方法,具體應(yīng)用XML 存儲,只是它功能中的一個功能而已,具體用它做什么因個人的習(xí)慣而定。

          # re: 淺談java.util.Properties [未登錄]  回復(fù)  更多評論   

          2008-07-01 09:26 by liwei
          寫得不錯

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          posts - 17, comments - 65, trackbacks - 0, articles - 28

          Copyright © 陜西BOY

          主站蜘蛛池模板: 云阳县| 大丰市| 灵石县| 乐陵市| 团风县| 湟源县| 株洲市| 哈巴河县| 印江| 望江县| 仙居县| 徐汇区| 武清区| 堆龙德庆县| 龙里县| 晋中市| 昭平县| 襄垣县| 望谟县| 铜陵市| 镇沅| 云浮市| 合肥市| 达州市| 达拉特旗| 大新县| 宜川县| 古交市| 牡丹江市| 枣阳市| 荥经县| 瑞丽市| 北川| 崇礼县| 巴林左旗| 庄河市| 格尔木市| 航空| 霍州市| 县级市| 南乐县|