读取配置文件随想
2017-05-16 17:37
337 查看
无论项目大小,数据库、开发环境、测试环境....这些信息,肯定不能在程序中硬编码。
硬编码有百坏而无一利,每次信息变动都要重新编译项目,不能分离运维和开发。
而且配置散落在项目的程序中,无法做到准确集中管理,拖慢项目进度。
我想这也是配置文件出现的原因,配置文件比较主流的格式 properties(键值对形式)、xml(对象,复杂数据结构,只有你想不到没有xml 表达不了的) 等。
本文已比较常见、简单的 properties 格式的配置文件为例,来看看读取配置文件几种不同的姿势,关注其中的实现和使用,设计模式另表。
配置文件中需要添加(PS :多配置文件,添加 ignore-unresolvable 参数)。
然后再需要的地方
动态读入可以使用 Spring 提供了默认的配置文件读取实现类 org.springframework.core.io.DefaultResourceLoader。
当然你也可以实现 org.springframework.core.io.ResourceLoader 接口自定义配置文件载入实现类。
org.springframework.core.io.DefaultResourceLoader 核心方法 getResource:
可以看出 Spring 能支持入参路径的很多方式,包括已 " /"、"classpath" 开头。
如果你想在项目中使用 Spring 提供的默认配置文件载入实现,可以这样书写你的代码。
当然你也可以引入 Apache Commons Configuration jar 内部设计相当考究。
整个 jar 不超过 400K,如果时间充裕,你也可以反编译看看源码。
使用方式也特别简洁,两行代码就 OK:
Apache Commons Configuration 默认载入配置文件核心实现类 org.apache.commons.configuration.AbstractFileConfiguration 载入方法:
回到顶部
仔细一点,你会发现,这些开源框架底层都是已 java.net.URL 载入配置文件。
在载入配置文件的过程中应项目需求采用了恰当的设计模式,使能够支持一些对配置文件的特定操作。
载入文件后,实例化为 java.util.Properties 对象,进行配置文件获取。
那就完全可以撸段纯 JDK 的写法,作为工具类放入项目中,编译后不超过 5K,核心的几句代码如下:
因为 java.util.Properties 的 load 进行了方法的重载,你也可以不用 URL 方式读取配置文件,也可以这样写:
上述代码都为实例核心的几句代码,其中的判空和异常都没有进行处理,仅作为参考。
最后贴上自己封装的配置文件载入类,不使用任何第三方 jar,有需要的拿走放入项目即可用。
View
Code
使用方式也很简单,支持多路径读入,如果存在相同 Key 后面的覆盖前面的:
硬编码有百坏而无一利,每次信息变动都要重新编译项目,不能分离运维和开发。
而且配置散落在项目的程序中,无法做到准确集中管理,拖慢项目进度。
我想这也是配置文件出现的原因,配置文件比较主流的格式 properties(键值对形式)、xml(对象,复杂数据结构,只有你想不到没有xml 表达不了的) 等。
本文已比较常见、简单的 properties 格式的配置文件为例,来看看读取配置文件几种不同的姿势,关注其中的实现和使用,设计模式另表。
1. Spring 和 Apache Commons Configuration
如果项目中没什么特殊的个性化读取配置文件需求,可以使用 Spring 管理配置文件信息,然后注入到需要的地方。配置文件中需要添加(PS :多配置文件,添加 ignore-unresolvable 参数)。
<context:property-placeholder location="classpath:db-info.properties" ignore-unresolvable="true"/> <context:property-placeholder location="classpath:web.properties" ignore-unresolvable="true"/>
然后再需要的地方
动态读入可以使用 Spring 提供了默认的配置文件读取实现类 org.springframework.core.io.DefaultResourceLoader。
当然你也可以实现 org.springframework.core.io.ResourceLoader 接口自定义配置文件载入实现类。
org.springframework.core.io.DefaultResourceLoader 核心方法 getResource:
public Resource getResource(String location) { Assert.notNull(location, "Location must not be null"); Iterator ex = this.protocolResolvers.iterator(); Resource resource; do { if(!ex.hasNext()) { if(location.startsWith("/")) { return this.getResourceByPath(location); } if(location.startsWith("classpath:")) { return new ClassPathResource(location.substring("classpath:".length()), this.getClassLoader()); } try { URL ex1 = new URL(location); return new UrlResource(ex1); } catch (MalformedURLException var5) { return this.getResourceByPath(location); } } ProtocolResolver protocolResolver = (ProtocolResolver)ex.next(); resource = protocolResolver.resolve(location, this); } while(resource == null); return resource; }
可以看出 Spring 能支持入参路径的很多方式,包括已 " /"、"classpath" 开头。
如果你想在项目中使用 Spring 提供的默认配置文件载入实现,可以这样书写你的代码。
ResourceLoader resourceLoader = new DefaultResourceLoader(); Resource resource = resourceLoader.getResource("log4j.properties"); Properties props = new Properties(); props.load(resource.getInputStream());
当然你也可以引入 Apache Commons Configuration jar 内部设计相当考究。
整个 jar 不超过 400K,如果时间充裕,你也可以反编译看看源码。
使用方式也特别简洁,两行代码就 OK:
PropertiesConfiguration configuration = new PropertiesConfiguration("log4j.properties"); configuration.getString("log4j.appender.file");
Apache Commons Configuration 默认载入配置文件核心实现类 org.apache.commons.configuration.AbstractFileConfiguration 载入方法:
public void load(String fileName) throws ConfigurationException { try { URL e = ConfigurationUtils.locate(this.fileSystem, this.basePath, fileName); if(e == null) { throw new ConfigurationException("Cannot locate configuration source " + fileName); } else { this.load(e); } } catch (ConfigurationException var3) { throw var3; } catch (Exception var4) { throw new ConfigurationException("Unable to load the configuration file " + fileName, var4); } }
回到顶部
2. JDK 经典手写
如果你项目对读取配置文件没有太多个性化的需求,如果你有足够时间,如果你嫌弃第三方 Jar 占据你 lib 目录的一席之地,还有如果你热爱编程。仔细一点,你会发现,这些开源框架底层都是已 java.net.URL 载入配置文件。
在载入配置文件的过程中应项目需求采用了恰当的设计模式,使能够支持一些对配置文件的特定操作。
载入文件后,实例化为 java.util.Properties 对象,进行配置文件获取。
那就完全可以撸段纯 JDK 的写法,作为工具类放入项目中,编译后不超过 5K,核心的几句代码如下:
URL resource = Thread.currentThread().getContextClassLoader().getResource("log4j.properties"); Properties properties = new Properties(); properties.load(resource.openStream()); properties.getProperty(key);
因为 java.util.Properties 的 load 进行了方法的重载,你也可以不用 URL 方式读取配置文件,也可以这样写:
String url = XXXXX.class.getResource("").getPath().replaceAll("%20", " "); String path = url.substring(0, url.indexOf("classes")) + filePath; //该 path 为你配置文件的路径 InputStream inputStream = new FileInputStream(path); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); prop.load(bufferedReader);prop.getProperty(key);
上述代码都为实例核心的几句代码,其中的判空和异常都没有进行处理,仅作为参考。
最后贴上自己封装的配置文件载入类,不使用任何第三方 jar,有需要的拿走放入项目即可用。
View
Code
使用方式也很简单,支持多路径读入,如果存在相同 Key 后面的覆盖前面的:
PropertiesLoader propertiesLoader = new PropertiesLoader("log4j.properties"); System.out.println(propertiesLoader.getProperty("log4j.appender.file"));
相关文章推荐
- 读取配置文件随想
- Web.config文件中节点的配置数值读取的2种方法,哪种更快?
- 浅析log4net配置文件的读取机制
- 配置文件读取类
- 脚本引擎之----读取INI配置文件
- 自定义配置文件的读取
- 读取配置文件的例子
- Python读取XML配置文件小例子
- 读取ini配置文件的API
- XML配置文件的读取(sax)
- 读取INI配置文件内容(源文件C)
- Log4Net的Config配置文件读取
- INI的替代品--XML配置文件读取与保存
- 读取配置文件的类
- [Config]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value
- samba unix风格的配置文件配置信息读取C代码.
- XML配置文件的读取处理
- 用vb.net读取INI配置文件的方法,使用API
- stl读取ini配置文件例子
- XML配置文件的读取处理(转)