如何以原始顺序读取java中的属性文件

wen*_*wen 14 java enumeration properties

我需要读取一个属性文件并在Java中生成一个Properties类.我这样做是通过使用:

Properties props = new Properties();
props.load(new FileInputStream(args[0]));
for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
}
Run Code Online (Sandbox Code Playgroud)

但是,props.propertyName返回的属性不是原始属性文件的顺序.我知道属性只是老式的,非泛化的Hashtables.我正在寻找一个解决方案.任何的想法?谢谢!

YoK*_*YoK 17

来自www.java2s.com的示例应该可以解决您的问题.

import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

/**
 * <a href="OrderedProperties.java.html"><b><i>View Source</i></b></a>
 *
 * @author Brian Wing Shun Chan
 *
 */
public class OrderedProperties extends Properties {

    public OrderedProperties() {
        super ();

        _names = new Vector();
    }

    public Enumeration propertyNames() {
        return _names.elements();
    }

    public Object put(Object key, Object value) {
        if (_names.contains(key)) {
            _names.remove(key);
        }

        _names.add(key);

        return super .put(key, value);
    }

    public Object remove(Object key) {
        _names.remove(key);

        return super .remove(key);
    }

    private Vector _names;

}
Run Code Online (Sandbox Code Playgroud)

您的代码将更改为:

Properties props = new OrderedProperties();
props.load(new FileInputStream(args[0]));
for (Enumeration e = props.propertyNames(); e.hasMoreElements();) {
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*oyd 13

您可以扩展Properties并将所有map方法委托给LinkedHashMap以保留顺序.这是一个示例(您可能需要覆盖更多方法):

public class LinkedProperties extends Properties{


    private static final long serialVersionUID = 1L;

    private Map<Object, Object> linkMap = new LinkedHashMap<Object,Object>();

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

    @Override
    public synchronized boolean contains(Object value){
        return linkMap.containsValue(value);
    }

    @Override
    public boolean containsValue(Object value){
        return linkMap.containsValue(value);
    }

    @Override
    public synchronized Enumeration<Object> elements(){
        throw new UnsupportedOperationException(
          "Enumerations are so old-school, don't use them, "
        + "use keySet() or entrySet() instead");
    }

    @Override
    public Set<Entry<Object, Object>> entrySet(){
        return linkMap.entrySet();
    }

    @Override
    public synchronized void clear(){
        linkMap.clear();
    }

    @Override
    public synchronized boolean containsKey(Object key){
        return linkMap.containsKey(key);
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 7

类似于上面的一个,但没有维护我们自己的值列表的开销.我们所要做的就是维护一个单独的有序键列表,并提供一个新的"keys()"方法.


public class SequencedProperties extends Properties {

    private static final long serialVersionUID = -7032434592318855760L;

    private List keyList = new ArrayList();

    @Override
    public synchronized Enumeration keys() {
        return Collections.enumeration(keyList);
    }

    @Override
    public synchronized Object put(Object key, Object value) {
        if (! containsKey(key)) {
            keyList.add(key);
        }

        return super.put(key, value);
    }

    @Override
    public synchronized Object remove(Object key) {
        keyList.remove(key);

        return super.remove(key);
    }

    @Override
    public synchronized void putAll(Map values) {
        for (Object key : values.keySet()) {
            if (! containsKey(key)) {
                keyList.add(key);
            }
        }

        super.putAll(values);
    }
}
Run Code Online (Sandbox Code Playgroud)


pav*_*imo 6

您可能希望实现具有类似功能的属性类.您无法获得订单,因为正如您已经指出的那样,它使用了Hashtable.