標籤:java properties
序
前幾天,公司項目中有一個需求是讀取設定檔的,而且最好能夠保證載入到記憶體中的順序能夠和設定檔中的順序一致,但是,如果使用 jdk 中提供的 Properties 類的話,讀取設定檔後,載入到記憶體中的順序是隨機的,不能保證和原檔案的順序一致,因此,jdk 提供的 Properties 是不行的。
背景
由於有這樣的需求,而 Java 的 Properties 類又不能實現,因此只能想別的辦法。我曾經想過,在把設定檔載入到記憶體後,對其進行排序,但這個方案會有很多限制,而且也有問題。設定檔中的資訊會有很多,如果對其進行再排序的話,首先會影響系統的效能,其次,對程式的執行效率來講,也會有一定的影響。最後,經過一番查證之後,同事找到了一篇類似的文章。
解決方案
從文章中瞭解到,Java 的 Properties 載入屬性檔案後是無法保證輸出的順序與檔案中一致的,因為 Properties 是繼承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保證進出順序的。
文章中已經給提供了代碼,思路是繼承自 Properties,覆蓋原來的 put/keys,keySet,stringPropertyNames 即可,其中用一個 LinkedHashSet 來儲存它的所有 key。完整代碼如下:
<span style="font-family:Comic Sans MS;">package com.mstar.investmeplugin; import java.util.Collections;import java.util.Enumeration;import java.util.LinkedHashSet;import java.util.Properties;import java.util.Set; /** * OrderedProperties * @author liii * @date 2015-07-10 */public class OrderedProperties extends Properties { private static final long serialVersionUID = -4627607243846121965L; private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>(); public Enumeration<Object> keys() { return Collections.<Object> enumeration(keys); } public Object put(Object key, Object value) { keys.add(key); return super.put(key, value); } public Set<Object> keySet() { return keys; } public Set<String> stringPropertyNames() { Set<String> set = new LinkedHashSet<String>(); for (Object key : this.keys) { set.add((String) key); } return set; }}</span>
調用方法
<span style="font-family:Comic Sans MS;">Properties props = new OrderedProperties();props.load(fileInputStream); //通過 keys(), keySet() 或 stringPropertyNames 來遍曆都能保證按檔案中的順序輸出</span>
結束語
這種特定的需求,以前倒是沒怎麼接觸過,不給通過這次的經曆,發現了一點,自己的積累還是很少,不多說了,繼續努力吧。
參考:
- StackOverflow
- Playframework1中的另一個實現
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
讀設定檔可以保持順序的 Java Properties 類