如何在Java属性文件中维护键的顺序?

时间:2014-08-06 12:23:01

标签: grails groovy gradle

我有Groovy代码来读取属性文件并更改值,然后将其写入同一文件。

def props = new Properties()
File propsFile = new File('C:/Groovy/config.properties')
props.load(propsFile.newDataInputStream())

props.each { key, value ->

    if("${key}" == "ABC"){
        props.setProperty("${key}", "XYZ")

    }

}
props.store(propsFile.newWriter(), null)

当我将属性写入文件时,它会更改键的顺序。有没有办法维持与初始文件相同的顺序。

我是groovy的新手,请有人给出这个建议吗?

2 个答案:

答案 0 :(得分:10)

我检查了Properties类,结果证明它扩展了Hashtable,但没有对其元素的排序做出任何保证。所以这就是输出文件混淆了密钥的原因。

在我看来,你必须覆盖至少两个方法:put,为每个属性调用(按顺序发生),以及在保存期间调用的keys。您只需使用此类而不是Properties

import java.util.*;

public class OrderedProperties extends Properties {
    private final LinkedHashSet<Object> keyOrder = new LinkedHashSet<>();

    @Override
    public synchronized Enumeration<Object> keys() {
        return Collections.enumeration(keyOrder);
    }

    @Override
    public synchronized Object put(Object key, Object value) {
        keyOrder.add(key);
        return super.put(key, value);
    }
}

我刚刚在你的场景中对它进行了测试并且工作正常,但我当然没有想到所有可能的情况。我们在这里延长Hashtable(小心!),而不是我说的通常决定......

答案 1 :(得分:1)

也许使用装饰属性:

class SortedProperties extends Properties {

    @Override
    public synchronized Enumeration keys() {
        Enumeration keysEnum = super.keys();

        Vector keyList = new Vector();
        while (keysEnum.hasMoreElements()) {
            keyList.add(keysEnum.nextElement());
        }
        keyList.sort()

        return keyList.elements();
    }
}