传统通过读取资源文件方式:
1、Properties
Properties pro = new Properties ();
加载资源文件分如下几种:
(1)、pro.load(new FileInputStream("config.properties"));读取当前目录的config.properties文件
(2)、props.load(getClass.getResourceAsStream("config.properties")); 读取当前类所在位置一起的config.properties文件
(3)、props.load(getClass.getResourceAsStream("/config.properties")); 读取ClassPath的根的config.properties文件,注意ClassPath如果是多个路径或者jar文件的,只要在任意一个路径目录下或者jar文件里的根下都可以,如果存在于多个路径下的话,按照ClassPath中的先后顺序,使用先找到的,其余忽略
备注:加载XML方式类似,只是调用loadFromXML(in);
获取属性值的方式:
String | getProperty(String key) 用指定的键在此属性列表中搜索属性。 |
String | getProperty(String key, String defaultValue) 用指定的键在属性列表中搜索属性。 |
2、ResourceBundle
加载资源文件的方式
(1)ResourceBundle bundle = ResourceBundle.getBundle("config");
(2)ResourceBundle res = ResourceBundle.getBundle("config.properties");
获取属性值的方式:
abstract Enumeration<String> | getKeys() 返回键的枚举。 |
Object | getObject(String key) 从此资源包或它的某个父包中获取给定值的对象。 |
String | getString(String key) 从此资源包或它的某个父包中获取给定值的字符串。 |
String[] | getStringArray(String key) 从此资源包或它的某个父包中获取给定值的字符串数组。 |
使用commons-configuration.jar 中的Configuration读取资源文件
1、Properties
比如,有如下的配置信息:
speed=23.332 names=Bob,Gautam,Jarret,Stefan correct=false |
可以像这样来访问他们:
Configuration config = new PropertiesConfiguration(getClass() .getResource("/resources/config.properties")); float speed = config.getFloat("speed"); List names = config.getList("names"); boolean correct = config.getBoolean("correct"); |
传递给PropertiesConfiguration构建函数的参数可以是文件名、可以访问到文件的URL、以及文件本身(File对象)。当然,Properties类也可以完成同样的事情,但只支持返回String类型的值。
2、XML
希望使用XML格式的配置文件来配置应用程序。
解决方案:
Configuration config = new XMLConfiguration("resources/config.xml"); List criterias = config.getList("start-criteria.criteria"); String criteria = config.getString("start-criteria.criteria(0)"); String type = config.getString("start-criteria.criteria(0)[@type]");//自己替换[] int horsepower = config.getInt("horsepower"); |
使用XMLConfiguration类可以加载并访问XML格式的配置文件,访问配置信息使用的是XPath格式 (XPath请参数相应的XML文档)。
传递给XMLConfiguration构建函数的参数可以是文件名、可以访问到文件的URL、以及文件本身(File对象)。
3、组合配置
有时候应用程序使用一种多层结构的配置方式,即上一层的配置可以被下一层选择性地覆盖。
解决方案:
configuration.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <configuration> <properties fileName="user.properties" /> <properties fileName="local.properties" /> <properties fileName="global.properties" /> </configuration> |
global.properties
threads.max=50 threads.min=2 timeout=15.52 interactive=true color=red speed=50 name=Default User |
local.properties
# Overrides Global Props threads.max=30 speed=55 |
user.properties
# Overrides Local Props threads.min=1 color=black speed=5000 name=Sean |
ConfigurationFactory factory = new ConfigurationFactory(); factory.setConfigurationURL(CfgTest3.class.getResource("/resources/configuration.xml")); Configuration config = factory.getConfiguration(); // print out properties System.out.println("Timeout: " + config.getFloat("timeout")); System.out.println("Max Threads: " + config.getString("threads.max")); System.out.println("Name: " + config.getString("name")); System.out.println("Speed: " + config.getInt("speed")); |
创建一个声明多个properties配置的configuration.xml文件,并传递给ConfigurationFactory,ConfigurationFactory解析这些properties配置,生成一个包含最终配置信息的Configuration实例,通过这个实例访问到的配置信息,就是被覆盖过的最终版本。
上面实例中的configuration.xml文件由多个<properties/>元素组成,覆盖的顺序由上往下,也就是说user.properties会覆盖local.properties,local.properties会覆盖global.properties。
其他:
configuration.xml文件可以使用如下的元素来声明配置文件:
•<properties/> 用于声明properties格式的配置文件
•<xml/>用于声明xml格式的配置文件
除了可以访问properties格式和xml格式的配置文件以外,Commons Configuration包还定义了JNDIConfiguration类来访问JNDI树格式的配置信息。