保持顺序的 Java Properties 类
原文地址:http://gflei.iteye.com/blog/1851875
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
不过没找到源码,其实自己写一个 OrderedProperties 也不难,并不需要重头写起,只要继承自 Properties,覆盖原来的 put/keys,keySet,stringPropertyNames 即可,其中用一个 LinkedHashSet 来保存它的所有 key。完整代码如下:
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Properties;
import java.util.Set;
import java.util.Collections;
public class MyProperties extends Properties {
private static final long serialVersionUID = 1L;
private final LinkedHashSet<Object> keys = new LinkedHashSet<Object>();
@Override
public synchronized Object put(Object key, Object value) {
// TODO Auto-generated method stub
keys.add(key);
return super.put(key, value);
}
@Override
public Set<String> stringPropertyNames() {
// TODO Auto-generated method stub
Set<String> set = new LinkedHashSet<String>();
for (Object obj : keys) {
set.add((String) obj);
}
return set;
}
@Override
public Set<Object> keySet() {
// TODO Auto-generated method stub
return this.keys;
}
public Enumeration<Object> keys() {
return Collections.<Object>enumeration(keys);
}
}