« VirtualBox 命令行启动 | Main | NetBeans 6.7 M3值得关注的... »
http://developers.sun.com.cn/blog/functionalca/date/20090403 星期五 2009年04月03日

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其实可以读取

  • Properties files
  • XML documents
  • Windows INI files
  • Property list files (plist)
  • JNDI
  • JDBC Datasource
  • System properties
  • Applet parameters
  • Servlet parameters

    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]
    评论:

    发表一条评论:
    • HTML语法: 禁用