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)