`
h819
  • 浏览: 89898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Apache Commons-configuration 学习笔记

阅读更多
转载自 http://wangxin0072000.iteye.com

Apache Commons-configuration 学习笔记
1 如果要使用configuration这个包,首先要保证使用JDK1.2以上,还要引入如下jar包
commons-beanutils
commons-lang
commons-logging
commons-collections
commons-digester
commons-codec
commons-jxpath
2 commons-configuration最新的版本是1.5,最主要的作用是读取资源文件,每一种文件格式都有一个对应的类,如下
properties文件--PropertiesConfiguration类
xml文件--XMLConfiguration
.ini文件--INIConfiguration
.plist文件--PropertyListConfiguration
还可以从JNDI中读取properties--JNDIConfiguration
当然还可以使用system的properties--SystemConfiguration
等等...

3 上面已经对它做了基本的介绍,下面看看这个包怎么用吧
比如我们要读一个properties文件:在classpath下面建立目录te,之后在te下面建立
test.properties
ip=127.0.0.1  
port=8080  
id=111  
application.name = Killer App   
application.version = 1.6.2  
application.title = ${application.name} ${application.version}   
keys=cn,com,org,uk,edu,jp,hk  

//注意路径默认指向的是classpath的根目录   
Configuration config = new PropertiesConfiguration("te/test.properties");   
String ip=config.getString("ip");   
int port=config.getInt("port");   
String title=config.getString("application.title");   
//再举个Configuration的比较实用的方法吧,在读取配置文件的时候有可能这个键值对应的值为空,那么在下面这个方法中   
//你就可以为它设置默认值。比如下面这个例子就会在test.properties这个文件中找id的值,如果找不到就会给id设置值为123   
//这样就保证了java的包装类不会返回空值。虽然功能很简单,但是很方便很实用。   
Integer id=config.getInteger("id", new Integer(123));   
//如果在properties 文件中有如下属性keys=cn,com,org,uk,edu,jp,hk   
//可以实用下面的方式读取:   
String[] keys1=config.getStringArray("keys");   
    List keys2=config.getList("keys");  

首先要把这个文件读到程序中,我们可以用上面的类,所有的读取文件的类都 继承自AbstractConfiguration类,
而这个类实现了Configuration接口,如果我们只有比较简单的需求,那么可以直接向上转型为Configuration类型,如果向上
转型为AbstractConfiguration类,那么可以做一些配置工作。
比如刚刚看到的 keys=cn,com,org,uk,edu,jp,hk这个例子中如果是keys=cn/com/org/uk/edu/jp/hk
那么如果还按照原来的方式读取,读到的将是"cn/com/org/uk/edu/jp/hk"这个字符串,所以要先改变分割符之后在读

AbstractConfiguration.setDefaultListDelimiter('/');   
Configuration config = new PropertiesConfiguration("te/Vasp.properties");   
String[] keys=config.getStringArray("keys");   
List key2=config.getList("keys");  

如果你看它的源码,你会在 AbstractConfiguration这个类中找到:
private static char defaultListDelimiter = ',';  


如果你确定要解析的文件是properties ,那么你完全可以使用
PropertiesConfiguration config = new PropertiesConfiguration("tt/t.properties"); 

代替
Configuration config = new PropertiesConfiguration("tt/t.properties");  

这么写似乎不符合面向接口编程,但是它可以使用PropertiseConfiguration中特殊的方法。
比如,你如果你想修改propertise文件,那么可以这样:
config.setProperty("id", "sss");   
config.save();  

当然,你还可以使用isAutoSave这个方法:
config.isAutoSave();   
config.setProperty("tttt", "sss");  

properties这个类还支持文件的继承,比如在test.properties这个文件中有
include = test1.properties  

同时在classpath中又有test1.properties这个文件,那么PropertiesConfiguration类就可以
从test1.properties文件中读取信息。

读取XML
假如有个XML,名叫:XMLtest.xml如下:
<?xml version="1.0" encoding="ISO-8859-1" ?>   
<gui-definition>   
  <colors>   
    <background>#808080</background>   
    <text>#000000</text>   
    <header>#008000</header>   
    <link normal="#000080" visited="#800080"/>   
    <default>${colors.header}</default>   
  </colors>   
  <rowsPerPage>15</rowsPerPage>   
  <buttons>   
    <name>OK,Cancel,Help</name>   
    <name>Yes,No,Cancel</name>   
  </buttons>   
  <numberFormat pattern="###\,###.##"/>   
</gui-definition>

标准的XML文件都会有一个跟标签包裹住所有内容,这个标签的子标签认为是顶级名字空间
(这个说法可能不准确)不多说了看代码吧
XMLConfiguration config = new XMLConfiguration("XMLtest.xml");   
/**  
    *<colors>  
  *  <background>#808080</background>  
  *  <text>#000000</text>  
  *  <header>#008000</header>  
  *  <link normal="#000080" visited="#800080"/>  
  *  <default>${colors.header}</default>  
  *</colors>  
    *这是从上面的xml中摘抄的一段,我们现在来解析它,  
    *colors是根标签下的直接子标签,所以是顶级名字空间  
    */  
String backColor = config.getString("colors.background");   
String textColor = config.getString("colors.text");   
//现在我们知道了如何读取标签下的数据,那么如何读标签中的属性呢?看下面   
//<link normal="#000080" visited="#800080"/>   
String linkNormal = config.getString("colors.link[@normal]");   
//还支持引用呢!   
//<default>${colors.header}</default>   
String defColor = config.getString("colors.default");   
//也支持其他类型,但是一定要确定类型正确,否则要报异常哦   
//<rowsPerPage>15</rowsPerPage>   
int rowsPerPage = config.getInt("rowsPerPage");  

/**  
    *但是我们如何读取List呢  
    *看这里:  
    *<buttons>  
  *  <name>OK,Cancel,Help</name>  
  *  <name>Yes,No,Cancel</name>  
  *</buttons>  
  */  
  这时我们可以用:   
  List buttons = config.getList("buttons.name");   
  for(String button:buttons){   
            System.out.println(button);   
        }  

但是显示的是
OK   
Cancel   
Help   
Yes   
No   
Cancel  

我们想要的是
OK,Cancel,Help   
Yes,No,Cancel 

如果看过之前的文章就会知道,我们有一些设置没有设
也就是我们要禁用List分隔符delimiter.在AbstractionConfiguration
这个类中(XMLConfiguration的父类)有这个setDelimiterParsingDisabled方法可以
禁用分隔符。但是要在读取XML文件之前设置这个属性。所以代码改为
XMLConfiguration config = new XMLConfiguration();   
        config.setDelimiterParsingDisabled(true);   
        config.setFileName("XMLtest.xml");   
        config.load();   
        List<String> buttons = config.getList("buttons.name");   
        for(String button:buttons){   
            System.out.println(button);   

这就可以了。


再来个更加复杂一点的XML
<?xml version="1.0" encoding="ISO-8859-1" ?>   
<database>   
  <tables>   
    <table tableType="system">   
      <name>users</name>   
      <fields>   
        <field>   
          <name>uid</name>   
          <type>long</type>   
        </field>   
        <field>   
          <name>uname</name>   
          <type>java.lang.String</type>   
        </field>   
        <field>   
          <name>firstName</name>   
          <type>java.lang.String</type>   
        </field>   
        <field>   
          <name>lastName</name>   
          <type>java.lang.String</type>   
        </field>   
        <field>   
          <name>email</name>   
          <type>java.lang.String</type>   
        </field>   
      </fields>   
    </table>   
    <table tableType="application">   
      <name>documents</name>   
      <fields>   
        <field>   
          <name>docid</name>   
          <type>long</type>   
        </field>   
        <field>   
          <name>name</name>   
          <type>java.lang.String</type>   
        </field>   
        <field>   
          <name>creationDate</name>   
          <type>java.util.Date</type>   
        </field>   
        <field>   
          <name>authorID</name>   
          <type>long</type>   
        </field>   
        <field>   
          <name>version</name>   
          <type>int</type>   
        </field>   
      </fields>   
    </table>   
  </tables>   
</database>  

这个XML的结构是根节点为database
database   
  |-table   
     |-name   
     |-fields   
         |-field   
         |-field   
  |-table   
     |-name   
     |-fields   
         |-field   
         |-field  


眼尖的一眼就能看穿这是一个数据库的定义文件,那么我们如何读取呢?
好吧,我们接上文,来看看吧
XMLConfiguration config = new XMLConfiguration();   
        config.setDelimiterParsingDisabled(true);   
        config.setFileName("tt/test2.xml");   
        config.load();   
        Object prop = config.getProperty("tables.table.name");   
        if(prop instanceof Collection)   
        {   
            System.out.println("Number of tables: " + ((Collection) prop).size());   
        }  

前面的我就不说了,看看这句
Object prop = config.getProperty("tables.table.name"); 
if(prop instanceof Collection) 
{ 
System.out.println("Number of tables: " + ((Collection) prop).size()); 
} 

config读取属性的时候,会去看得到的是否是多个值,如果是,则把这些值存为一个Collection
对象。 所以会打印出
Number of tables: 2  

在使用getProperty方法时,我们给不同的节点路径会给我们不同的值,直接看例子:
//return users   
System.out.println(config.getProperty("tables.table(0).name"));   
//return system   
System.out.println(config.getProperty("tables.table(0)[@tableType]"));   
//return documents   
System.out.println(config.getProperty("tables.table(1).name"));   
//return null,因为只有两个table所以这个值为null   
System.out.println(config.getProperty("tables.table(2).name"));   
//return [docid, name, creationDate, authorID, version]   
//如果所要找的节点不存在唯一值,则返回Collection类型   
System.out.println(config.getProperty("tables.table(1).fields.field.name"));   
//[long, long]   
//与上面的相同,返回值不唯一   
System.out.println(config.getProperty("tables.table.fields.field(0).type"));   
//return creationDate   
System.out.println(config.getProperty("tables.table(1).fields.field(2).name"));  
分享到:
评论

相关推荐

    node-v6.11.1-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030中国风机盘管组市场现状研究分析与发展前景预测报告.docx

    2024-2030中国风机盘管组市场现状研究分析与发展前景预测报告

    node-v4.8.6-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    dust_sensor_code_x2.zip

    dust_sensor_code_x2.zip

    人力资源管理习题答案及题库

    人力资源管理习题答案及题库

    基于微信小程序的智慧超市购物车系统设计与开发教程论文题目.docx

    基于微信小程序的智慧超市购物车系统设计与开发教程论文题目.docx

    node-v6.14.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    53-53.渗透测试-CSRF案例分析.mp4

    53-53.渗透测试-CSRF案例分析.mp4

    Tetris base on Android(基于Android的俄罗斯方块).zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    Java毕业设计-基于SSM框架的《数据库系统原理》课程平台(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的《数据库系统原理》课程平台(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:562】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员在后台可以全面管理系统,管理员的功能主要包括用户管理、新闻管理、书籍管理和评论管理等。 用户在没有注册之前,进入网站,用户的主要功能包括查看网站首页、公告信息、书籍分类和书籍信息,用户在注册登录后进入网站,用户的主要功能包括书籍评论、加入书架、书籍下载、个人信息管理、我的书架和我的留言。

    使用 python 的异步库 playwright 进行爬取豆瓣电影排行榜的数据

    免费,开源项目! spiderDouban.py 文件是一个Python程序,主要目的是利用异步库 playwright 进行爬取豆瓣电影排行榜的数据。该程序包含两个类:FunChart 和 PlaywrightChart。主要功能如下: FunChart 类:定义了一些基础配置,如网页URL、是否使用headless模式、并发控制、登录设置等。它还包含了数据保存、随机等待和检查已爬取链接的方法。 PlaywrightChart 类继承自 FunChart,专注于实际的排行榜爬取: open_browser() 方法启动一个持久会话的Chromium浏览器,根据配置加载页面并检查是否需要爬取新的数据。 get_page() 用于获取页面,并处理可能的登录和请求拦截。 open_page() 方法负责爬取页面中的链接列表,然后在并发控制下逐个爬取数据,并在遇到错误时记录日志。 spiderAll() 方法是对单个链接的详细爬取,包括滑动加载更多数据。 程序的入口点在 if __name__ == "__main__": 中,这里实例化 PlaywrightChart 类并开始爬取。

    node-v6.0.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.8.3-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.3.1-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2024-2030中国二甲基三硫醚市场现状研究分析与发展前景预测报告.docx

    2024-2030中国二甲基三硫醚市场现状研究分析与发展前景预测报告

    40-40.XSS跨站脚本攻击植入方式.mp4

    40-40.XSS跨站脚本攻击植入方式.mp4

    example1c.c

    example1c.c

    数字化转型中的大数据治理架构qy.pptx

    数字化转型中的大数据治理架构qy.pptx

    2024-2030中国独立式美容激光器市场现状研究分析与发展前景预测报告.docx

    2024-2030中国独立式美容激光器市场现状研究分析与发展前景预测报告

    Adafruit-MPU6050.rar

    mpu6050

Global site tag (gtag.js) - Google Analytics