2008年12月26日

java.util.Properties的應用:setProperty, getProperty, storeToXML, loadFromXML


 
在我們撰寫java的過程中常需要設定一些外部的參數
譬如說連線的IP位址或都某些路徑的設定
這些參數當然可以直接設定在 .java 的程式碼中
只是這樣每次更改都必須重新 compile 非常不便

所以這篇要介紹的是把 (key, value) 設定在檔案中的方法
只要透過 java.util.Properties 就可以輕鬆達到我們的目的
之後更改參數不用在程式碼中尋找,全都設定在一份檔案中即可

先說明一下下面的程式碼
首先我們還不知道 java.util.Properties 所能讀取的檔案格式
所以一開始我們先設定幾組參數後利用內建的功能產生 .xml 和 .properties
詳細的檔案格式內容我有列出來

知道格式之後我們以後就可以寫好參數在檔案中
然後再使用 function 把參數取出來,這些也有詳細的說明
以下是程式 Demo:
  1. import java.io.*;
  2. import java.util.Properties;

  3. public class PropertiesDemo {

  4. private static Properties props;

  5. public static void main(String[] args) {

  6. props = new Properties();

  7. // 用props.setProperty("key", "value")設定(key, value)配對
  8. props.setProperty("key1", "value1");
  9. props.setProperty("key2", "中文測試");

  10. // 用 props.list(System.out)在console 印出props中所有的(key, value)配對
  11. // -- listing properties --
  12. // key2=中文測試
  13. // key1=value1
  14. System.out.println("在console 印出props中所有的(key, value)配對");
  15. props.list(System.out);
  16. System.out.println();

  17. // 設定重覆的(key, value)配對會覆蓋掉
  18. // -- listing properties --
  19. // key2=中文測試
  20. // key1=更改value1
  21. System.out.println("印出更改後所有的(key, value)配對");
  22. props.setProperty("key1", "更改value1");
  23. props.list(System.out);
  24. System.out.println();

  25. try {
  26. // 輸出props中所有的(key, value)配對到xml(storeToXML)及txt(store)
  27. // 輸出後Stream不會自動關閉必須手動關閉,否則有可能出錯(不是在()中使用new時)
  28. // storeToXML(OutputStream os, Stirng comment, String encode)
  29. // storeToXML(OutputStream os, Stirng comment) encode預設使用 UTF-8
  30. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  31. props.store(new FileOutputStream("properties.properties"), "store");
  32. } catch (FileNotFoundException e) {
  33. e.printStackTrace();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }

  37. props.clear();

  38. try {
  39. // props.getProperty(key)讀出(key, value)配對
  40. // props.getProperty(String key, String defaultWhenNotFound)
  41. // props.getProperty(String key) throws exception when not found
  42. System.out.println("props.getProperty(key)讀出(key, value)配對");
  43. props.load(new FileInputStream("properties.properties"));
  44. System.out.println(props.getProperty("key", "test")); // default value test
  45. System.out.println(props.getProperty("key1"));
  46. props.clear();
  47. System.out.println();
  48. } catch (FileNotFoundException e) {
  49. e.printStackTrace();
  50. } catch (IOException e) {
  51. e.printStackTrace();
  52. }

  53. try {
  54. // 印出從 properties.xml 讀出的所有(key, value)配對
  55. System.out.println("印出properties.xml讀出的所有(key, value)配對");
  56. props.loadFromXML(new FileInputStream("properties.xml"));
  57. props.setProperty("key3", "new value");
  58. props.list(System.out);

  59. // 將新配對寫回 properties.xml,串流沒出錯
  60. props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
  61. } catch (FileNotFoundException e) {
  62. e.printStackTrace();
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. }
輸出結果:
  1. 在console 印出props中所有的(key, value)配對
  2. -- listing properties --
  3. key2=中文測試
  4. key1=value1

  5. 印出更改後所有的(key, value)配對
  6. -- listing properties --
  7. key2=中文測試
  8. key1=更改value1

  9. props.getProperty(key)讀出(key, value)配對
  10. test
  11. 更改value1

  12. 印出properties.xml讀出的所有(key, value)配對
  13. -- listing properties --
  14. key3=new value
  15. key2=中文測試
  16. key1=更改value1
產生的 properties.properties內容:
#store
#Fri Dec 26 15:23:38 CST 2008
key2=\u4E2D\u6587\u6E2C\u8A66
key1=\u66F4\u6539value1
使用 store 所產生的文件並不直接支援中文
所以建議使用 storeToXML

產生的 properties.xml內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>storeToXML</comment>
<entry key="key3">new value</entry>
<entry key="key2">中文測試</entry>
<entry key="key1">更改value1</entry>
</properties>
關鍵字:Properties, setProperty, getProperty, storeToXML, loadFromXML, 參數


更多精選推薦文章

0 意見 :