搜尋此網誌

2013年8月17日 星期六

【Java】外部設定檔的應用(java.util.Properties)

在code的過程中,總會有部分設定,可以直接寫死在檔案中
但希望將來是可以直接透過外部修改某文字檔案內容
code在根據此文件修改,做出相對應的修改動作
而不用每次都透過更新程式碼部分變數(參數),就又要重新comple code
非常沒必要。


所以需要一個可以直接引用外部參數的方法。
而java.util.Properties剛好可以滿足我們需求
透過Properties可以產生key-value pair的.xml或者是.properties並讀取key對映到的value


  • 常見應用:

    • 連線IP位址
    • 某些路徑的設定
    • i18n多國語言(.properties)

    以下部分內容轉載自[1],原文太過冗長,螢光部分較須先了解,橘色部分額外添加

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

    private static Properties props = new Properties();

    //一個key對應一個value

    props.setProperty("key1", "value1");
    props.setProperty("key2", "中文測試");

    System.out.println("在console 印出props中所有的(key, value)配對");
    props.list(System.out);
    System.out.println();

    //重覆設定相同的key不同的value,則key對映之舊value會被新value覆蓋
    System.out.println("印出更改後所有的(key, value)配對");
    props.setProperty("key1", "更改value1");
    props.list(System.out);
    System.out.println();

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

    props.clear();

    try {
        // props.getProperty(key)讀出(key, value)配對
        // props.getProperty(String key, String defaultWhenNotFound)
        // props.getProperty(String key) throws exception when not found
           System.out.println("props.getProperty(key)讀出(key, value)配對");
       
    // default value test
           props.load(new FileInputStream("properties.properties"));
           System.out.println(props.getProperty("key", "test"));   

           System.out.println(props.getProperty("key1"));
           props.clear();
           System.out.println();
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }

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

        // 將新配對寫回 properties.xml,串流沒出錯
           props.storeToXML(new FileOutputStream("properties.xml"), "storeToXML");
        } catch (FileNotFoundException e) {
           e.printStackTrace();
        } catch (IOException e) {
           e.printStackTrace();
        }

    }
    ----------------------------------------------------------
    輸出結果:
    在console 印出props中所有的(key, value)配對
     -- listing properties --
     key2=中文測試
     key1=value1

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

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

     印出properties.xml讀出的所有(key, value)配對
     -- listing properties --
     key3=new value
     key2=中文測試
     key1=更改value1
    ----------------------------------------------------------
    產生的 properties.properties內容:
    #store
    #Sat Aug 17 15:39:54 CST 2013
    key2=\u4E2D\u6587\u6E2C\u8A66
    key1=\u66F4\u6539value1
    使用 store 所產生的文件並不直接支援中文,所以建議使用 storeToXML

    假如為了要看的見中文而使用xml會使得檔案的字元數變得更多,讓檔案size變得更大。不是一個好的建議方法。而是依照使用需求再做決定xml還是properties。

    ----------------------------------------------------------
    產生的 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>


    在Eclipse讀取properties檔案下,預設的text editor會把中文顯示成Unicode的編碼方式,實際上系統讀進來的字還是對的。所以解決的點應該是讓properties可以顯示中文。 解決方法

    沒有留言: