Jodd Props 是對Java自帶的properties 的加強,文法風格相似於ini文件,表現力豐富,比json/xml等配置更簡單,更可讀,更易使用。html
Props 補充了不少JDK所須要的:
對UTF8的支持, 插值, 區段, 多配置, fully configurable… 等等!
配置能夠保存在*.props
文件中, 也能夠經過其餘形式傳入,
例如:字符串、File、InputStream 、Map等。並且, Props 兼容Java自帶的properties.java
如下是 props
文件的基本文法。具體用法可見附帶的例子:json
props
文件採用UTF8 做爲默認編碼, 固然你也能夠指定其它的編碼。
可是無論設置了什麼編碼,Props將會一直使用ISO 8859-1編碼加載
Java自帶的Properties文件(後綴名是.properties)。app
區段名和屬性名將會刪除前後空白字符。屬性值也會這麼修建測試
支持兩種符號 (=
) (:
)this
使用 +=
可將屬性值附加到該屬性,注意:附加的值以英文逗號分隔編碼
單行註釋支持兩種符號:;
和#
。也沒必要須是每行的第一個符號。url
使用(\
) 來轉義特殊字符(如, \#
\\
)。spa
若是行末是(\
), 下一行將繼續被包含在值裏面。(注: 換行不會被保留).net
\\uXXXX
將會編碼成一個字符。\t
, \r
and \f
也是。
可使用三個單引號('''
)更方便的設置一個多行的值,(注: 換行將會被保留)
很簡單. 簡單的說,都是交給Props
類。
Props p = new Props(); p.load(new File("example.props")); ... String story = p.getValue("story");
Props
能夠從多種類型導入(load)屬性: File
、InputStream
、
String
或者 Properties
。而後調用 getValue()
來獲取屬性值,
返回值類型是一個字符串。
區段看起來和 Windows INI 文件的很類似。在 Props裏,區段其實是
接下來幾個屬性值的前綴,直到下一個區段,或者文件的末尾。
區段名使用[
]
包裹。區段名也能夠爲空
例如:
[users.data] weight = 49.5 height = 87.7 age = 63 [] comment=this is base property
等同於:
users.data.weight = 49.5 users.data.height = 87.7 users.data.age = 63 comment=this is base property
區段, 精簡了配置文件,同時更可讀
一般狀況下,一個應用將會部署在不一樣的環境中,因而,須要一些不一樣的配置。
例如一個應用的開發模式和生產模式。其中一個解決方案就是:
同一個屬性容許配多個不一樣的值。
Props 支持這種多配置. 配置能夠跟隨屬性名一塊兒設置。配置名使用 <
>
包裹。
一個值也能夠擁有多個配置。實際上,配置名能夠被放在屬性名的任意位置,
可是咱們強烈建議放在屬性名以後,這樣作更合理一些。
沒有設置配置的屬性數據「基礎配置」. 若是沒有找到指定配置的屬性值, Props 將會
從這些「基礎配置」裏尋找。這樣,配置能夠被視爲一個「不一樣的角度的視圖」或者
相同屬性集的「快照」
例如:
db.port=3086 db.url<develop>=localhost db.username<develop>=root db.url<deploy>=192.168.1.101 db.username<deploy>=app2499
注:develop-開發模式 deploy-生產模式
上面的例子設置了3個屬性, 其中有兩個屬性有兩套配置(develop
和 deploy
)沒有「基礎配置」
因爲區段只是屬性值的前綴,而且配置也能夠放在屬性值的中間, 因而,配置也能夠卸載區段名裏面
因而,上面的例子也能夠寫成:
db.port=3086 [db<develop>] url=localhost username=root [db<deploy>] url=192.168.1.101 username=app2499
當查找值的時候, 就能夠指定一個配置:
String url = props.getValue("db.url", "develop"); String user = props.getValue("db.username", "develop");
能夠一次同時指定多個配置。當一個值頂一個多個配置,他們之間的順序是很重要的
(補充:String user = props.getValue("db.username", "develop", "deploy");
)
{: .attn}
固然也能夠只從「基礎配置」裏查找 – 使用getBaseValue()
方法。
「基礎配置」 不屬於其餘任何配置。
一般, 在應用的生命週期中之會激活一個配置。爲了方便每次不用都傳入配置文件
給 getValues()
。 Props 容許定義激活的配置。
激活的配置是調用getValue(String)
時默認使用的配置。
激活的配置能夠在 props
文件中設置 – 這樣當修改默認配置的時候就不用從新編譯
源代碼。 激活的配置使用一個特殊的名字@profiles
。
例如:
key1=hello key1<one>=Hi! @profiles=one
當在Java獲取值得時候:
String value = props.getValue("key1");
由於激活了配置’one
‘, 將會獲得 ‘Hi!
‘。
固然激活的配置也能夠在Java裏設置,只須要調用方法setActiveProfiles()
。
上面的爲引用文章引用地址:
http://www.kankanews.com/ICkengine/archives/92722.shtml
下面的爲本身作的demo:
prop文件:
@profiles=proTest baseValue=baseV name=base_name_測試 name<proTest>=base_name_proTest [Cmd] CipherCache=0 Desc=沒有指定1_${baseValue} name+=${baseValue} [Cmd<test>] CipherCache=test Desc=test_Desc [Cmd<base>] CipherCache=base Desc=base_Desc #[Cmd<com>] #CipherCache=base #Desc=com [Cmd<jn>] CipherCache=base Desc=jn [Cmd<sd>] CipherCache=base Desc=sd
調用代碼:
ErrorCodeDesc.Instance().Load("config/ErrorCodeDesc.prop"); Props props = ErrorCodeDesc.Instance().GetProps(); System.out.println("props.getValue(\"Cmd.Desc\",\"base\") : "+props.getValue("Cmd.Desc","base")); System.out.println("props.getValue(\"Cmd.Desc\",\"test\") : "+props.getValue("Cmd.Desc","test")); System.out.println("props.getValue(\"Cmd.Desc\") : "+props.getValue("Cmd.Desc")); System.out.println("props.getValue(\"baseValue\") : "+props.getValue("baseValue")); System.out.println("props.getValue(\"Cmd.baseValue\") : "+props.getValue("Cmd.baseValue")); System.out.println("props.getValue(\"Cmd.name\") : "+props.getValue("Cmd.name"));
輸出爲:
17:40:52.982 [main] DEBUG System - ErrorCodeDesc加載完成:config/ErrorCodeDesc.prop props.getValue("Cmd.Desc","base") : base_Desc props.getValue("Cmd.Desc","test") : test_Desc props.getValue("Cmd.Desc") : 沒有指定1_baseV props.getValue("baseValue") : baseV props.getValue("Cmd.baseValue") : null props.getValue("Cmd.name") : baseV