如何维护 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 属性文件中键的顺序?的主要内容,如果未能解决你的问题,请参考以下文章
java是否根本修改不了properties文件中键的值啊?