但希望將來是可以直接透過外部修改某文字檔案內容
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可以顯示中文。 解決方法
沒有留言:
張貼留言