当前位置: 技术问答>java相关
关于读取配置文件的问题
来源: 互联网 发布时间:2015-04-25
本文导语: 配置文件格式如下: #注释 [segment1] key1=... key2=... [segmenti] keyi=... 现在要编写一个类,把配置文件中的参数存入vector中,请问该如何实现。 是不是要用到StreamTokenizer,请给出代码,谢谢! | properties是...
配置文件格式如下:
#注释
[segment1]
key1=...
key2=...
[segmenti]
keyi=...
现在要编写一个类,把配置文件中的参数存入vector中,请问该如何实现。
是不是要用到StreamTokenizer,请给出代码,谢谢!
#注释
[segment1]
key1=...
key2=...
[segmenti]
keyi=...
现在要编写一个类,把配置文件中的参数存入vector中,请问该如何实现。
是不是要用到StreamTokenizer,请给出代码,谢谢!
|
properties是没有section信息的。
所以这一点就是你要处理的,比如可以这样:
localhost.host=172.20.5.1
loclahost.port=3336
another.host=172.20.5.2
anothre.port=2345
...
然后你取出properties中的所有key,它也是一个vector,把localhost等前缀信息取出即可。
可参考如下代码:
Vector res = new Vector();
Enumeration propNames = serversProps.propertyNames();
while (propNames.hasMoreElements()) {
String name = (String) propNames.nextElement();
if(name.endsWith(".host")) {
String connName = name.substring(0, name.lastIndexOf("."));
String connHost = serversProps.getProperty(connName + ".host");
if (connHost == null) {
throw new Exception(connName+" have not host address.");
}
String port= serversProps.getProperty(connName+".port");
String userID = serversProps.getProperty(connName + ".user");
String passWord = serversProps.getProperty(connName + ".password");
String dataBase = serversProps.getProperty(connName +".database");
ServerTreeNode serverNode = new ServerTreeNode(connName);
serverNode.setServerProperties(connHost,port,dataBase,userID,passWord);
res.add(serverNode);
}//end if name.endsWith".host"
}//end while propNames.hasMoreElements
return res;
|
StreamTokenizer
是将有分隔符的字符串分成一个一个的单个值
如:abc def ghi
分成:abc
def
ghi
如果每个key后的值是一个:如:key1=abc
考虑使用Property来解决问题。
是将有分隔符的字符串分成一个一个的单个值
如:abc def ghi
分成:abc
def
ghi
如果每个key后的值是一个:如:key1=abc
考虑使用Property来解决问题。
|
为什么不用properties文件来做配置文件呢?用它很方便呀。
Properties props = new Properties();
props.load( new java.io.FileInputStream("xxx.properties"));
int num = 1;
String[] key = new key[10];
String key[num] = props.getProperty("key"+num);
Properties props = new Properties();
props.load( new java.io.FileInputStream("xxx.properties"));
int num = 1;
String[] key = new key[10];
String key[num] = props.getProperty("key"+num);
|
你可以使用ResourceBundle.详细可参照jdk的APIs文档
比如:
protected static Properties props = new Properties();
bundle = ResourceBundle.getBundle(sPropFile);
Enumeration enum = bundle.getKeys();
Object key = null;
Object value = null;
// System.out.println("GET PROPERTIES.... ");
while( enum.hasMoreElements() ){
key = enum.nextElement();
value = bundle.getString(key.toString());
props.put(key, value);
// System.out.println("["+key+"]=["+value+"]");
}
比如:
protected static Properties props = new Properties();
bundle = ResourceBundle.getBundle(sPropFile);
Enumeration enum = bundle.getKeys();
Object key = null;
Object value = null;
// System.out.println("GET PROPERTIES.... ");
while( enum.hasMoreElements() ){
key = enum.nextElement();
value = bundle.getString(key.toString());
props.put(key, value);
// System.out.println("["+key+"]=["+value+"]");
}
|
简单的properties文件只能实现类似hash表的数据结构,一个key对应一个value。所有的信息都要定义key(注释除外),然后通过key取。
不然象你这样的,恐怕就要考虑用xml了,就变复杂了。
不然象你这样的,恐怕就要考虑用xml了,就变复杂了。
|
好像XML更好的
|
复杂的配置文件用xml是好点,但是如果只有两层,用xml也没必要了,因为用xml来处理要带个xml的解析器(用jdk1.4例外)。而用properties则是jre自己支持的,速度也会快一些了。
|
properties 没有 [session] 信息的,如果你需要分类,只好用前缀的办法,如:
你的
#注释
[segment1]
key1=...
key2=...
[segmenti]
keyi=...
可改成
#注释
segment1.key1=...
segment1.key2=...
segmenti.keyi=...
你的
#注释
[segment1]
key1=...
key2=...
[segmenti]
keyi=...
可改成
#注释
segment1.key1=...
segment1.key2=...
segmenti.keyi=...
|
把文件读入然后解析,那样很笨的方法,建议用property,xml