读配置文件能够保持顺序的 Java Properties 类
生活随笔
收集整理的這篇文章主要介紹了
读配置文件能够保持顺序的 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 类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue.js第六课 计算属性
- 下一篇: 25 个 Java 机器学习工具和库