PropertiesConfiguration学习与使用

本文介绍了Apache Commons Configuration中的PropertiesConfiguration,一种改进的Properties文件处理方式。它不仅支持按文件顺序读取和保留顺序,还提供自动同步文件更改、自动保存以及读写注释等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PropertiesConfiguration学习与使用

前言:

假设有这样的需求,需要按照文件的顺序读取Properties文件,这时该怎么做。直接使用java.util.Properties是做不到的,因为Properties继承自Hashtable;随便搜索一下就可以得到一个,继承Properties,自己维护一个LinkedHashSet的解法。这个方法当然可以解,但再次假如基础上我还要保证我修改Properties调用save之后的文件保持顺序,就比较麻烦了,更别说我还想加些注释。自己实现这么个东西想想就头大,好在Apache已经帮我们做好了,这就是PropertiesConfiguration,人活着,还是要抱紧大腿。
先说好,我用的是org.apache.commons.configuration 1.10,而不是2.1.1。2.1.1的初始化太长看着难受。

一、Properties能做的它都能做

    //先看看Properties
    String propertiesFileName="a.properties";
    Properties props = new Properties();
    props.load(new FileInputStream(propertiesFileName));
    String value =props.getProperties("key");

    //然后是PropertiesConfiguration
    PropertiesConfiguration propsConfig=new PropertiesConfiguration();
    //默认的编码格式是ISO-8859-1,所以才在读取文件之前先设置了编码格式
    propsConfig.setEncoding("UTF-8")
    propsConfig.load(propertiesFileName);
    String strValue=propsConfig.getString("key");
    String longValue=propsConfig.getLong("longKey");
    String[] strArray=propsConfig.getStringArray(arrayKey);
    //值得一提的是。propsConfig的默认分割符是',',换句话说,如果值使用','分割,使用getString去取的话是会抛出异常的,因为这被认为是个数组,分割符可以使用setListDelimiter设置。
    ...
    props.setProperty(someKey,someValue);
    props.clearProperty(someKey);

PropertiesConfig有所有基本类型的get方法,以及删除属性的clearProperty方法。load,save方法没什么区别就没写。。

二、除此之外还有什么?

2.1、遍历

Properties本身就是个Hashtable,使用遍历map的方法就好了。而PropertiesConfiguration并没有把它是用什么实现的暴露出来,而是提供了getKeys方法,返回迭代器,重要的是这个迭代器是按照文件顺序读取的。这就让人非常开心了。顺便一提,调用save方法保存的时候并不会改变文件顺序。

2.2、同步

假设使用Properties,我希望内存中的Properties对象的数据与文件总是保持同步,那我只能写个定时器,检查文件是否更新过,是否需要重新读取。但PropertiesConfiguration就不用,它提供了setReloadingStrategy方法,可以设置重加载策略,常见的有

 propsConfig.setReloadingStrategy(new FileChangedReloadingStrategy());

当文件被修改时重新加载。除此之外还有。

 propsConfig.setAutoSave(true);

修改属性之后自动保存。

2.3、一些让人快乐的功能

在PropertiesConfiguration中,我还发现了个好东西,叫做PropertiesConfigurationLayout,可以用get方法获取它。它能干什么呢?最让我感兴趣的是,它可以读写注释。注释是一个可以让几个月之后的自己变得开心的东西,所以何乐而不为呢。

    PropertiesConfigurationLayout layout=propsConfig.getLayout();
    String comment =layout.getComment();
    layout.setComment("some comment");

除此之外PropertiesConfigurationLayout还有很多方法,我没都看,取决于是否需要了。

三、总结

我要告别java.util.Properties。

### 使用 `PropertiesConfiguration` 进行 Java 属性文件配置管理 #### 加入依赖项 为了使用 `PropertiesConfiguration` 类,项目中需引入 Apache Commons Configuration 库。可以通过 Maven 的 POM 文件加入如下依赖: ```xml <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.10</version> </dependency> ``` 此库提供了一套灵活的方法来处理不同类型的配置源,包括 `.properties` 文件[^4]。 #### 创建并加载配置对象 下面展示了一个简单的例子,说明怎样创建一个 `PropertiesConfiguration` 实例,并从中读取数据: ```java import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.configuration.ConfigurationException; public class ConfigExample { public static void main(String[] args) { try { // 初始化配置实例 PropertiesConfiguration config = new PropertiesConfiguration("application.properties"); // 获取字符串型属性值 String serverName = config.getString("server.name"); System.out.println("Server Name: " + serverName); } catch (ConfigurationException e) { e.printStackTrace(); } } } ``` 这段代码展示了如何通过指定路径加载名为 `application.properties` 的配置文件,并获取其中定义的一个键为 `"server.name"` 的字符串值[^3]。 #### 修改和保存配置 除了读取现有设置外,还可以利用 `PropertiesConfiguration` 对象更新或新增条目到配置文件里。完成更改之后记得调用相应的保存方法使改动生效: ```java // 设置新的属性值 config.setProperty("new.key", "value of the key"); try { // 将变更写回原文件或其他目标位置 config.save(); } catch (ConfigurationException ex) { ex.printStackTrace(); } ``` 上述片段演示了向已有的配置集合添加新键/值对的方式以及持久化这些变化至磁盘上的过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值