JavaEE读取配置文件的常用策略
Author:曹祺
Email:Qi.Cao@Sun.Com
难度:入门
源代码下载:
http://developers.sun.com.cn/blog/functionalca/resource/Greysh/FCA_Greysh_Configuration.zip
原文链接:
http://developers.sun.com.cn/blog/functionalca/entry/javaee%E8%AF%BB%E5%8F%96%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%B8%B8%E7%94%A8%E7%AD%96%E7%95%A5
简介
Helloworld
简介
JavaEE在开发的时候,如果是系统内部常量,一般提倡用枚举常量类,写在单独的类中,但是经常要修改的变量,比如数据源配置,如果存在数据库中,有种浪费。但是存在TXT中扩展性不好,就笔者观察,一般的程序员都喜欢把经常修改的常量存在xml文件或者properties文件。
存在xml文件最大的好处是扩展性很好,一般用sax或者dom这两个方向的框架,比如DOM4J,JDOM等。Sun推出的JAXM(Java API for XML Messaging)也是用的DOM4J。由于SAX的处理方式类似流媒体,是逐行的,不需要全部加载。而DOM是全部加载在内存,生成树。因而SAX的读取比DOM性能好,但是修改的话DOM略胜一筹。properties文件的扩展性不如xml,但是有很多xml没法实现的优势,比如加密之类的~
Helloworld
笔者根据自己开发中感受,写了一个工具包,用来体现读取xml或者properties的流程,大家在使用的时候记得修改文件路径。一共包含五个文件.本demo主要是用来模拟读取数据库的账户和密码的,读者可以在此基础上扩展。
config.properties
account=Genix.Cao
password=Greysh
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<roots>
<account>Genix.Cao</account>
<password>Greysh</password>
</roots>
接口
package com.greysh.config;
import java.util.Map;
public interface LoadConfig {
public void init(String path) throws Exception;
public Map<String, String> process(Map<String, String> config)
throws Exception;
}
主要包含两个方法,一个是初始化,一个是处理xml
之所以process,笔者是打算把要读取的参数作为map的键,然后读取后得到map的值,
方便其他程序使用
读取Properties文件的Property类代码如下
package com.greysh.config;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
public class Property implements LoadConfig {
private CompositeConfiguration compositeConfiguration;
@Override
public void init(String path) throws Exception {
compositeConfiguration = new CompositeConfiguration();
compositeConfiguration.addConfiguration(new PropertiesConfiguration(
path));
}
@Override
public Map<String, String> process(Map<String, String> config)
throws Exception {
Map<String, String> map = new HashMap<String, String>();
for (String key : config.keySet()) {
String value = compositeConfiguration.getString(key);
map.put(key, value);
}
return map;
}
public static void main(String[] args) throws Exception {
Map<String, String> config = new HashMap<String, String>();
config.put("account", null);
config.put("password", null);
Property property = new Property();
property.init("src/config.properties");
Map<String, String> result = property.process(config);
System.out.println(result);
}
}
运行后,打印出来的结果是
{account=Genix.Cao, password=Greysh}
为简化代码,这里采用了apache的common项目的configuration子项目
读者如果查看其源代码,可以登陆http://commons.apache.org/configuration/
configuration其实可以读取
configuration封装的很好,使用也非常方便,建议读者采用
另外一种方式是读取xml,代码如下
但是笔者为了更好的显示如何读取xml,因此读取xml不用configuration,而用JRE自带的处理类
package com.greysh.config;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class Jdom implements LoadConfig {
private Document doc;
@Override
public void init(String path) throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
doc = documentBuilder.parse(new File(path));
}
@Override
public Map<String, String> process(Map<String, String> config)
throws Exception {
Map<String, String> map = new HashMap<String, String>();
for (String key : config.keySet()) {
NodeList nodeList = doc.getElementsByTagName(key);
Node node = nodeList.item(0);
String value = node.getFirstChild().getNodeValue();
map.put(key, value);
}
return map;
}
public static void main(String[] args) throws Exception {
Map<String, String> config = new HashMap<String, String>();
config.put("account", null);
config.put("password", null);
Jdom jdomRead = new Jdom();
jdomRead.init("src/config.xml");
Map<String, String> result = jdomRead.process(config);
System.out.println(result);
}
}
在读取xml的时候,首先要生成文档制造工厂类,实例化之后生成一个文档制造类去解析xml
一般作为配置文件的参数是不会重复的,因此可以采用
Node node = nodeList.item(0);
读到xml文件的值
最后用println方法打印出来的结果也是
{account=Genix.Cao, password=Greysh}
有了这个Map之后,其他程序就很方便调用了
如果想更好的了解读配置的方法,可以访问
http://commons.apache.org/configuration/
发表于 Sun Functional 校园大使 [JavaEE] ( 四月 03, 2009 02:31 上午 ) Permalink | 评论[0]
