利用Jakarta Commons的configuration包读取配置文件

配置文件一般常见的有两种:键值对格式,或XML配置文件,读取这类配置文件可以用Commons Configuration包。 键值对格式也就是常见的.properties文件。通过PropertiesConfiguration读取,如下:

package com.guoweiwei.test.configuration; import java.util.List;

import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; public class PropertiesReadExample {     /**      * @param args      * @throws ConfigurationException      */     public static void main(String[] args) throws ConfigurationException {        Configuration config = new PropertiesConfiguration(“com/guoweiwei/test/configuration/test.properties”);        float speed = config.getFloat(“speed”);        List names = config.getList(“names”);        boolean correct = config.getBoolean(“correct”);        System.out.println(“speed:” + speed);        System.out.println(“names:” + names.size());        System.out.println(“correct:” + correct);     } } 当然对XML文件的读取和解析也是如此简单:

package com.guoweiwei.test.configuration;import java.util.List; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.XMLConfiguration; public class XMLReadExample {     private static final String RESOURCE_FILE = “com/guoweiwei/test/configuration/test.xml”;     /**      * @param args      * @throws ConfigurationException      */     public static void main(String[] args) throws ConfigurationException {        Configuration config = new XMLConfiguration(RESOURCE_FILE);        List startCriteria = config.getList(“start-criteria.criteria”);        String firstCriteria = config.getString(“start-criteria.criteria(0)”);        String firstCriteriaType = config.getString(“start-criteria.criteria(0)[@type]“);        int horsepower = config.getInt(“horsepower”);        System.out.println(“startCriteria:” + startCriteria.size());        System.out.println(“firstCriteria:” + firstCriteria);        System.out.println(“firstCriteriaType:” + firstCriteriaType);        System.out.println(“horsepower:” + horsepower);     } }

从上面的代码可以看出,XMLConfiguration的getXXX()方法还支持XPath解析XML文件。 此外,可以综合使用XML和属性文件读取配置文件,比如一种常见的场景: 应用程序的配置有多个不同的地方。首先是一个全局配置;然后某个地方可能需要局部配置,当两者重复时以局部配置为准,然后还有一个用户自定义的配置文件,用户自定义的配置文件优先级又高于局部配置和全局配置。这个时候就可以考虑用一个ConfigurationFactory来管理了,将三个不同的配置文件分别定义为global.properties、local.properties、user.properties,然后通过一个configuration.xml的文件来管理三者之间的优先级关系,如下所示: 属性配置文件之一global.properties

threads.max=50threas.min=2 timout=15.52 interactive=true color=red speed=50 name=Default User

属性配置文件之二local.properties

threads.max=30speed=55

属性配置文件之三user.properties

threads.min=1color=black speed=5000 name=Sean

管理这三个属性配置文件的配置文件configuration.xml

    <properties fileName=_”user.properties”_/>     <properties fileName=_”local.properties”_/>     <properties fileName=_”global.properties”_/>

然后,应用程序中可以这样使用:

package com.guoweiwei.test.configuration;import java.net.MalformedURLException; import java.net.URL; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.ConfigurationFactory; public class ComplexConfigExample {     private static final String RESOURCE_FILE = “com/guoweiwei/test/configuration/complex/configuration.xml”;     /**      * @param args      * @throws ConfigurationException      * @throws MalformedURLException      */     public static void main(String[] args) throws ConfigurationException, MalformedURLException {        ComplexConfigExample c = new ComplexConfigExample();        c.ReadComplexConfiguration();     }     private void ReadComplexConfiguration() throws ConfigurationException{        ConfigurationFactory factory = new ConfigurationFactory();        //URL url = this.getClass().getResource(RESOURCE_FILE);        URL url = this.getClass().getResource(“complex/configuration.xml”);        factory.setConfigurationURL(url);        Configuration config = factory.getConfiguration();        System.out.println(“Timeout:”+config.getFloat(“timout”));        System.out.println(“Max Thread:”+config.getInt(“threads.max”));        System.out.println(“Name:”+config.getString(“name”));        System.out.println(“Speed:”+config.getInt(“speed”));     } }

最后的输出结果如下:

Timeout:15.52 【来自于global.properties】Max Thread:30 【来自于local.properties】 Name:Sean 【来自于user.properties】 Speed:5000 【来自于user.properties】