配置文件一般常见的有两种:键值对格式,或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
然后,应用程序中可以这样使用:
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】