絕大多數應用程序都需要一套持久保存的屬性(property)來維護正常的運行
我們常常用java
util包中的Properties類來實現這樣的存儲
它提供保存屬性的一套方便使用的機制
但是有時候
你需要更復雜的屬性文件結構
你可以通過擴展Properties類來達到這個目的
Properities類按照
關鍵字——值
對的形式來保存數據
它不允許復制
但實際上
對復制功能的需求又是很常見的
不過
通過把同樣的條目分成好幾個文件並給不同關鍵字拷貝同樣的值的方法
還是有可能用標准Properities類來達到拷貝的目的的
不幸的是
這個解決方法易於出錯
而且更改起來也很單調乏味
一個簡單的解決方法就是使用ProperitiesExpansion類
它允許用
${}
標記來擴展屬性來消除數據重復
它還允許你在同一個屬性文件中使用同樣的條目(通過把它們保存在不同的位置)
擴展屬性
屬性擴展的首要目的就是使得屬性文件中的數據表示更清晰更容易維護
為了達到這個目的
你可以用
${}
標記來引入可被替換的參數
這樣在運行時的屬性查詢時
它們可以擴展為用標記名所表示的值
下面是含有替換標記的屬性文件的一個例子
user
name=john
home
dir=usr
working
dir=${home
dir}/tmp
當訪問這些屬性時
${home
dir}
標記就用
usr
值所代替
這樣working
dir屬性就是usr/tmp
請查看代碼清單A所給出PropertiesExpansion類
為了提供標記擴展
我重載了標准Properties類的getProperty(String key)
setProperty(String key
String value)以及load(InputStream is)
我還添加了replace()方法
在清單A中有兩個已重載的replace()方法
一個用來從當前屬性清單中替換所有的替換標記
另一個repalce(String in
Hashtable keys)是一個方便的靜態方法
它用包含替換標記的哈希表對象來執行同樣的替換
我們重寫了setProperty()
load()和getProperty()方法
這樣它就可以檢查映射給定關鍵字的值是否包含擴展標記
如果發現擴展標記
它們就用合適的值來替換這些標記
局部屬性
在某些情況下
具有相同名字但映射為不同值的關鍵字是有用的
你可以通過局部(sectioning)屬性文件來達到這個目的
如下所示
# global properties
section
root=root
x
=
y
=
[user
]
x
=${x
}
y
=
[${section
root}]
x
=
y
=
在
user
之上的所有
關鍵字——值
對是全局參數
在程序不同的地方都可以引用這些全局參數來實現值替換
例如
在屬性擴展之後
${section
root}區域就變成了
root
區域
而屬性x
在user
區域的值為
如果你需要從指定區域中查詢一個已命名屬性
那麼你可以使用getProperty(String section
String key)方法
它把區域名作為一個附加參數
每個區域名都映射到一個包含
關鍵字——值
對的Properties對象
為了在user
區域內得到x
屬性的值
請用下面的一行代碼執行清單B中的代碼
PropertiesExpansion
getProperty(
user
x
)
清單B中的setProperty()方法用來為期望的區域設置
關鍵字——值
對
該方法調用哈希表的put()方法
該方法由PropertiesExpansion類所重載
Put()方法的訣竅在於判斷一個
關鍵字——值
對屬於哪個區域並相應更新該區域
由於put()方法允許插入其關鍵字或者值不是字符串的條目
所以我強烈希望你不要直接用put()方法來設置屬性
你可以通過調用sections()方法來查詢所有的區域的名字
該方法返回區域名字的枚舉類型
屬於某個區域的所有關鍵字可以通過調用sectionKeys()方法來查找到
為了利用區域的位置把屬性寫道文件之中
store()方法被重載了
還有諸如getInt()
getLong()
getFloat()
getDouble()和getBoolean()等附加的方法
它們用來簡化把屬性值的類型轉換為諸如整型
長整型
浮點型
雙精度和布爾等的簡單數據類型
這些方法的參數為包含給定關鍵字的值的附加Properties對象
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19643.html