讀設定檔可以保持順序的 Java Properties 類

來源:互聯網
上載者:User

標籤: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 類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.