java中关于properties文件(k-v形式描述)的应用是非常多的,java自带的Properties类实现Map接口也提供了一个很好的访问接口。
xxx.properties文件
requestinfo.title=Request Information Example
requestinfo.label.method=Method
requestinfo.label.requesturi=url
requestinfo.label.protocol=http,ftp,smtp
requestinfo.label.pathinfo=/
requestinfo.label.remoteaddr=127.0.0.1
requestinfo.label.isTimeout=false
requestinfo.label.minSpeed=1.4
这种就是以 key = value存在的配置文件。
我们一般如果通过java自带的Properties类读取的话,是用下面的方式
InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);
String value = p.getProperty(key);
我们通过这种方式来打开操作properties,尽管已经够简单了,但是觉得还是有点不够。
通过查一些资料,发觉apache的commons项目有个关于configuration的工具包。
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>
这个工具包提供了很多关于配置读取的封装,我们这里只看一下关于properties文件的读取。
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
Configuration config = new PropertiesConfiguration( "xxx.properties" );
float minSpeed = config.getFloat("minSpeed"));
List protocol= config.getList("requestinfo.label.protocol")); //自动读取为list,以,分开
boolean isTimeout= config.getBoolean("requestinfo.label.isTimeout");
简单明了的操作,感觉比java自带的properties类要更方便一些。
接下来是自己写的一个简单的工厂类,根据properties的classpath内路径还有文件名获得配置文件对象。
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: lsz
* Date: 14-4-5
* Time: 下午10:06
* 根据名字获得对应的配置文件
*/
public class ConfigurationFactory {
private static String basepath = "/";
private static Map<String ,Configuration> factory = new HashMap<String, Configuration>();
private ConfigurationFactory(){}
public static Configuration getConfiguration(String name,String path) throws ConfigurationException {
Configuration configuration = factory.get(name);
if(configuration == null){
synchronized (basepath){
if(configuration == null){
URL configURL = Configuration.class.getResource( path);
configuration = new PropertiesConfiguration(configURL.getPath()+name);
factory.put(name,configuration);
}
}
}
return configuration;
}
public static Configuration getConfiguration(String name) throws ConfigurationException {
return getConfiguration(name,basepath);
}
}