保持顺序的 Java Properties 类

Java 的 Properties 加载属性文件后是无法保证输出的顺序与文件中一致的,因为 Properties 是继承自 Hashtable 的, key/value 都是直接存在 Hashtable 中的,而 Hashtable 是不保证进出顺序的。


总有时候会有关心顺序一致的需求,恰如有 org.apache.commons.collections.OrderdMap(其实用 LinkedHashMap 就是保证顺序) 一样,我们也想要有个 OrderdProperties。网上查了下还真有:

http://livedocs.adobe.com/jrun/4/javadocs/jrunx/util/OrderedProperties.html

http://www.openrdf.org/doc/alibaba/2.0-rc4/apidocs/org/openrdf/repository/object/composition/helpers/OrderedProperties.html

不过没找到源码,其实自己写一个 OrderedProperties  也不难,并不需要重头写起,只要继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 即可,其中用一个 LinkedHashSet 来保存它的所有 key。完整代码如下:
 1package com.mstar.investmeplugin;
 2
 3import java.util.Collections;
 4import java.util.Enumeration;
 5import java.util.LinkedHashSet;
 6import java.util.Properties;
 7import java.util.Set;
 8
 9/**
10 * OrderedProperties
11 * @author Unmi
12 * @date 2012-12-07
13 */
14public class OrderedProperties extends Properties {
15
16    private static final long serialVersionUID = -4627607243846121965L;
17
18    private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
19
20    public Enumeration<Object> keys() {
21        return Collections.<Object> enumeration(keys);
22    }
23
24    public Object put(Object key, Object value) {
25        keys.add(key);
26        return super.put(key, value);
27    }
28
29    public Set<Object> keySet() {
30        return keys;
31    }
32
33    public Set<String> stringPropertyNames() {
34        Set<String> set = new LinkedHashSet<String>();
35
36        for (Object key : this.keys) {
37            set.add((String) key);
38        }
39
40        return set;
41    }
42}

用法:
1Properties props = new OrderedProperties();
2props.load(fileInputStream);
3
4//通过 keys(), keySet()  stringPropertyNames 来遍历都能保证按文件中的顺序输出

一直都是 StackOverflow 威武,本文主要参考自: http://stackoverflow.com/questions/1312383/pulling-values-from-a-java-properties-file-in-order

再看一个在 Playframework1 中的保持顺序的 OrderSafeProperties 的实现 https://github.com/playframework/play1/blob/master/framework/src/play/utils/OrderSafeProperties.java 永久链接 https://yanbin.blog/ordered-java-properties-class/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。