Properties类按顺序输出加载内容
2019-08-26 06:10:32来源:博客园 阅读 ()
Properties类按顺序输出加载内容
Properties类按顺序输出加载内容
最近手写工厂的时候,遇到了加载配置文件时不按照properties文件中的数据的顺序来加载。
一、问题代码
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesTest {
public static void main(String[] args) {
InputStream ips = null;
try {
ips = Properties.class.getResourceAsStream("/test.properities");
Properties props = new Properties();
props.load(ips);
for(String name:props.stringPropertyNames())
System.out.println(props.getProperty(name) + " "+name);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(ips != null){
ips.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
配置文件
cat=1
dog=2
bird=3
mouse=4
pig=5
输出结果
二、原因分析
public class Properties extends Hashtable<Object,Object>
上面是Properties类的定义,可以看到它继承了Hashtable类
public synchronized void load(InputStream inStream) throws IOException {
load0(new LineReader(inStream));
}
load方法调用load0方法
private void load0 (LineReader lr) throws IOException {
char[] convtBuf = new char[1024];
int limit;
int keyLen;
int valueStart;
char c;
boolean hasSep;
boolean precedingBackslash;
while ((limit = lr.readLine()) >= 0) {
c = 0;
keyLen = 0;
valueStart = limit;
hasSep = false;
//System.out.println("line=<" + new String(lineBuf, 0, limit) + ">");
precedingBackslash = false;
while (keyLen < limit) {
c = lr.lineBuf[keyLen];
//need check if escaped.
if ((c == '=' || c == ':') && !precedingBackslash) {
valueStart = keyLen + 1;
hasSep = true;
break;
}
else if ((c == ' ' || c == '\t' || c == '\f') && !precedingBackslash) {
valueStart = keyLen + 1;
break;
}
if (c == '\\') {
precedingBackslash = !precedingBackslash;
} else {
precedingBackslash = false;
}
keyLen++;
}
while (valueStart < limit) {
c = lr.lineBuf[valueStart];
if (c != ' ' && c != '\t' && c != '\f') {
if (!hasSep && (c == '=' || c == ':')) {
hasSep = true;
} else {
break;
}
}
valueStart++;
}
String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);
put(key, value);
}
}
load0方法可以看到最后取到key和value值后会调用父类Hashtable的put()
方法,把数据存入Hashtable,具体的Hashtable源码这里就不再贴出。简单来说Hashtable的put()
方法接收到值后会按照哈希值存储,而不是按照读取顺序存储。
接下来是读取时的源码,有兴趣的可以看一下:
public Set<String> stringPropertyNames() {
Hashtable<String, String> h = new Hashtable<>();
enumerateStringProperties(h);
return h.keySet();
}
enumerateStringProperties
方法:
private synchronized void enumerateStringProperties(Hashtable<String, String> h) {
if (defaults != null) {
defaults.enumerateStringProperties(h);
}
for (Enumeration<?> e = keys() ; e.hasMoreElements() ;) {
Object k = e.nextElement();
Object v = get(k);
if (k instanceof String && v instanceof String) {
h.put((String) k, (String) v);
}
}
}
Hashtable的keySet()
方法
public Set<K> keySet() {
if (keySet == null)
keySet = Collections.synchronizedSet(new KeySet(), this);
return keySet;
}
三、解决方法
写一个工具类继承Properties类,实现以下功能:
- 创建一个能够按照读取顺序来存储properities文件中的key值的集合框架
- 能够返回步骤1创建的集合
在这里我采用了LinkedList
来顺序存储key值(也可以采用别的集合类型),然后重写put方法,先把值存入自己建的LinkedList
中,再调用父类的方法。关于返回Key值的集合是新写了一个orderStringPropertyNames()
方法返回LinkedList
实现代码如下:
import java.util.LinkedList;
import java.util.Properties;
public class LinkedProperities extends Properties {
private LinkedList<String> linkedList = new LinkedList<String>();
@Override
public synchronized Object put(Object key, Object value) {
linkedList.add((String) key);
return super.put(key, value);
}
public LinkedList<String> orderStringPropertyNames() {
return linkedList;
}
}
四、结果测试
原文链接:https://www.cnblogs.com/ys1109/p/11382190.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring boot Sample 003之spring-boot-configuration-proper 2020-06-01
- 利用反射给对象按顺序赋值 2020-05-28
- Java连载116-IO与Properties联合应用 2020-05-19
- LeetCode 面试题58 - I. 翻转单词顺序 2020-05-16
- Java怎么从这四个位置读取配置文件Properties(普通文件系统 2020-05-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash