假设有这样的需求,需要按照文件的顺序读取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 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方法没什么区别就没写。。
Properties本身就是个Hashtable,使用遍历map的方法就好了。而PropertiesConfiguration并没有把它是用什么实现的暴露出来,而是提供了getKeys方法,返回迭代器,重要的是这个迭代器是按照文件顺序读取的。这就让人非常开心了。顺便一提,调用save方法保存的时候并不会改变文件顺序。
假设使用Properties,我希望内存中的Properties对象的数据与文件总是保持同步,那我只能写个定时器,检查文件是否更新过,是否需要重新读取。但PropertiesConfiguration就不用,它提供了setReloadingStrategy方法,可以设置重加载策略,常见的有
propsConfig.setReloadingStrategy(new FileChangedReloadingStrategy());
当文件被修改时重新加载。除此之外还有。
propsConfig.setAutoSave(true);
修改属性之后自动保存。
在PropertiesConfiguration中,我还发现了个好东西,叫做PropertiesConfigurationLayout,可以用get方法获取它。它能干什么呢?最让我感兴趣的是,它可以读写注释。注释是一个可以让几个月之后的自己变得开心的东西,所以何乐而不为呢。
PropertiesConfigurationLayout layout=propsConfig.getLayout(); String comment =layout.getComment(); layout.setComment("some comment");
除此之外PropertiesConfigurationLayout还有很多方法,我没都看,取决于是否需要了。
我要告别java.util.Properties。
联系客服