我有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的新手,请有人给出这个建议吗?
答案 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();
}
}