1、pom依赖添加

<!-- 配置文件读取 -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>1.10</version>
</dependency>

2、读取.properties文件

使用PropertiesConfiguration配置类,主要示例代码如下:

public static final String fileName = "test.properties";
public static PropertiesConfiguration cfg = null; static {
try {
cfg = new PropertiesConfiguration(fileName);
} catch (ConfigurationException e) {
e.printStackTrace();
}
// 当文件的内容发生改变时,配置对象也会刷新
cfg.setReloadingStrategy(new FileChangedReloadingStrategy());
} /**
* 读String
* @param key
* @return
*/
public static String getStringValue(String key) {
return cfg.getString(key);
} /**
* 读int
* @param key
* @return
*/
public static int getIntValue(String key) {
return cfg.getInt(key);
} /**
* 读boolean
* @param key
* @return
*/
public static boolean getBooleanValue(String key) {
return cfg.getBoolean(key);
}
/**
* 读List
*/
public static List<?> getListValue(String key) {
return cfg.getList(key);
}
/**
* 读数组
*/
public static String[] getArrayValue(String key) {
return cfg.getStringArray(key);
}

test.properties可以如下定义:

name=king
port=21
flag=true
interest=guitar,piano

之后就可以用给定的一些读取方法操作了

String name = CGPropetiesUtil.getStringValue("name");
System.out.println("String:" + name);

3、读取.xml文件

使用XMLConfiguration配置类

主要代码

  public static final String fileName = "test.xml";

    public static XMLConfiguration cfg = null;

    static {
try {
cfg = new XMLConfiguration(fileName);
} catch (Exception e) {
e.printStackTrace();
}
// 配置文件 发生变化就重新加载
cfg.setReloadingStrategy(new FileChangedReloadingStrategy());
} public static String getStringValue(String key) {
return cfg.getString(key);
} public static int getIntValue(String key) {
return cfg.getInt(key);
}

test.xml定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<config>
<database>
<url>127.0.0.1</url>
<port>1521</port>
<login>admin</login>
<password>admin</password>
</database>
</config>

测试操作同上。

4、对于一个文件来说,他的操作就对应一个配置类,而不能使用同一个配置类操作多个文件,否则它只以读取的第一个为操作对象。针对这种情况,可以写成一个通用的读取工具,简单示例如下:

public class CGCommonUtil {

    /**
* 一个文件对应一个Configuration
*/
public static Map<String, Configuration> configMap = new ConcurrentHashMap<String, Configuration>(); /**
* 文件后缀
*/
private static final String SUFFIX_PROPERTIES = ".properties";
private static final String SUFFIX_XML = ".xml"; public static Configuration getConfig(String fileName) {
if (!configMap.containsKey(fileName)) {
CGCommonUtil.initConfig(fileName);
} Configuration cfg = configMap.get(fileName);
if (null == cfg) {
throw new IllegalArgumentException("cfg is null");
} return cfg;
} private static void initConfig(String fileName) {
Configuration cfg = null;
try {
if (fileName.endsWith(SUFFIX_XML)) {
cfg = new XMLConfiguration(fileName);
} else if (fileName.endsWith(SUFFIX_PROPERTIES)) {
cfg = new PropertiesConfiguration(fileName);
}
} catch (ConfigurationException e) {
e.printStackTrace();
}
if (null != cfg) {
configMap.put(fileName, cfg);
} else {
System.out.println("cfg is null");
}
} /**
* 读String
* @param key
* @return
*/
public static String getStringValue(Configuration cfg, String key) {
return cfg.getString(key);
} /**
* 读int
* @param key
* @return
*/
public static int getIntValue(Configuration cfg, String key) {
return cfg.getInt(key);
} /**
* 读boolean
* @param key
* @return
*/
public static boolean getBooleanValue(Configuration cfg, String key) {
return cfg.getBoolean(key);
}
/**
* 读List
*/
public static List<?> getListValue(Configuration cfg, String key) {
return cfg.getList(key);
}
/**
* 读数组
*/
public static String[] getArrayValue(Configuration cfg, String key) {
return cfg.getStringArray(key);
} public static void main(String[] args) {
Configuration config = getConfig("test.properties");
String name1 = getStringValue(config, "name");
}
}

以上可以作为一个通用的读取工具,为每一个文件都设置了一个相应的配置操作类,如果考虑本地缓存影响会影响内存的话可以考虑定时删除缓存数据操作

5、Configuration读取文件源原

入口类ConfigurationUtils

主要涉及的方法如下:

locateFromClasspath方法:

static URL locateFromClasspath(String resourceName) {
URL url = null;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (loader != null) {
url = loader.getResource(resourceName);
if (url != null) {
LOG.debug("Loading configuration from the context classpath (" + resourceName + ")");
}
} if (url == null) {
url = ClassLoader.getSystemResource(resourceName);
if (url != null) {
LOG.debug("Loading configuration from the system classpath (" + resourceName + ")");
}
} return url;
}

首先它通过获取了当前线程的一个类加载器,通过加载器的getResouce方法去类加载器找到resourceName这个文件

getResouce方法:

public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}

先去父节点的loader去加载资源文件,如果找不到,则会去BootstrapLoader中去找,如果还是找不到,才调用当前类的classLoader去找。这也就是JDK类加载的双亲委派模型。

getInputStream方法:

public InputStream getInputStream(URL url) throws ConfigurationException {
File file = ConfigurationUtils.fileFromURL(url);
if (file != null && file.isDirectory()) {
throw new ConfigurationException("Cannot load a configuration from a directory");
} else {
try {
return url.openStream();
} catch (Exception var4) {
throw new ConfigurationException("Unable to load the configuration from the URL " + url, var4);
}
}
}

调用url的openStream()方法去获得此文件的输入流

GItHub源码参照

apache commons-configuration包读取配置文件的更多相关文章

  1. Apache Commons Configuration的应用

    Apache Commons Configuration的应用 Commons Configuration是一个java应用程序的配置管理工具.可以从properties或者xml文件中加载软件的配置 ...

  2. Apache Commons Configuration读取xml配置

    近期项目自己手写一个字符串连接池.因为环境不同有开发版本.测试版本.上线版本.每一个版本用到的数据库也是不一样的.所以需要能灵活的切换数据库连接.当然这个用maven就解决了.Apache Commo ...

  3. 使用Apache Commons Configuration读取配置信息

    在项目中使用一些比较新的库总会给你带来很多快乐,在这篇文章中,我将会给你介绍一个在Java中读取配置文件的框架——Apache Commons Configuration framework. 你会了 ...

  4. apache commons io包基本功能

    1. http://jackyrong.iteye.com/blog/2153812 2. http://www.javacodegeeks.com/2014/10/apache-commons-io ...

  5. apache commons lang包中的StringUtils

    计算一个字符串某个字符的出现次数 a, 使用charAt方法截取之后,循环判断. b, 使用apache commons lang包中的StringUtils: int n = StringUtils ...

  6. apache commons Java包简介

    更多信息,请参考:http://commons.apache.org/ 一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanU ...

  7. Apache Commons configuration使用入门

    使用Commons  Configuration可以很好的管理我们的配置文件的读写, 官网:http://commons.apache.org/configuration 需要用到commons-la ...

  8. IO与文件读写---使用Apache commons IO包提高读写效率

    觉得很不错,就转载了, 作者: Paul Lin 首先贴一段Apache commons IO官网上的介绍,来对这个著名的开源包有一个基本的了解:Commons IO is a library of ...

  9. jar包读取配置文件

    读取jar包内配置文件: Properties config = new Properties(); InputStream in = this.getClass().getClassLoader() ...

  10. 使用Apache Commons IO组件读取大文件

    Apache Commons IO读取文件代码如下: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new ...

随机推荐

  1. javascript中 for in 、for 、forEach 、for of 、Object.keys().

    一 .for ..in 循环 使用for..in循环时,返回的是所有能够通过对象访问的.可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例.这里需要注意的是使用for-in返回的属性因各 ...

  2. [转帖]VirtualBox 网络模式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://xiaoyu.blog.csdn.net/article/detail ...

  3. autocomplete undefined一例解决办法

    项目中一个页面jqueryui与extjs混用.当使用autocomplete时,会报undefined. 解决办法增加 var jq = jQuery.noConflict(true); 然后使用j ...

  4. c++11多线程记录5: Unique Lock和延时初始化

    https://www.youtube.com/user/BoQianTheProgrammer 视频网址 Unique Lock unique_lock和lock_guard类似,都是mutex的w ...

  5. python 通过Sybase ASE ODBC Driver访问sybase数据库,无需配置DSN【自己整理的】

    Python语言对于开发工程师或者测试工程师来说,应该是最高效的开发语言之一.但python访问sybase数据库的资料相对少见.而且sybase字符集为GB1803时,python访问sybase库 ...

  6. PB 修改datawindow 的背景色

    1.修改标题行的背景色 rgb(235, 235, 235) 2.修改选择行的背景色(即选择行高亮) if(currentrow() = getrow(), rgb(235,235,235), rgb ...

  7. wildfly添加JNDI驱动配置

    wildfly-9.0.1.Final/modules目录下新建com文件夹cd com && mkdir mysql && cd mysql && m ...

  8. CF704D Captain America 上下界网络流

    传送门 现在相当于说每一个条件都有一个染成红色的盾牌的数量限制\([l,r]\),需要满足所有限制且染成红色的盾牌数量最小/最大. 注意到一个盾牌染成红色对于一行和一列都会产生影响.如果选中一个物品对 ...

  9. SpringBoot中使用Interceptor

    https://www.cnblogs.com/chao555/p/9573102.html 1.创建自定义的拦截器并实现HandlerInterceptor接口 package com.demo.c ...

  10. netcore 实现跨应用的分布式session

    需求场景 网站a,域名为 a.site.com 网站b, 域名为 b.site.com 需要在a.b两个站点之间共享session 解决方案 使用redis作为分布式缓存存储 设置sessionId ...