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

Posted

技术标签:

【中文标题】如何维护 Java 属性文件中键的顺序?【英文标题】:How maintain the order of keys in Java properties file? 【发布时间】:2014-09-29 09:11:42 【问题描述】:

我有 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 的新手,请有人对此提出建议吗?

【问题讨论】:

【参考方案1】:

我检查了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(当心!),我会说这不是一个通常的决定......

【讨论】:

我发现这个没有效果,订单没有维护【参考方案2】:

也许使用修饰属性:

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();
    

【讨论】:

以上是关于如何维护 Java 属性文件中键的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

为啥map.put不维护键的顺序[重复]

按顺序从 Java 属性文件中提取值?

反射应用二(获取xml中键的属性及其值)

java是否根本修改不了properties文件中键的值啊?

在Java中遍历HashMap时如何确保键的顺序不能改变? [复制]

哈希表和键顺序