保持顺序的 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。完整代码如下:
用法:
一直都是 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) 进行许可。
总有时候会有关心顺序一致的需求,恰如有 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) 进行许可。