首先广告自己的工具包 http://www.oschina.net/p/common-tools
------------------------ 邪恶的分割线 ------------------------------------
由于Java是需要编译执行的,因此不像解释性语言那样可以把需要配置的文件放置在源代码中,因此我们最常用到的就是proerties文件和XML。当然后者的强大不容置疑,而应对一些简单的配置我们还是离不开proerties的,但是,properties文件的缺点有时令我们很郁闷……缺点如下:
1、只支持ASSCII编码,导致我想加个中文注释吧都费劲(谁让咱英语烂呢……) 2、Properties类的使用实在是不方便啊,我new完你还让我load一个流对象,费劲。 3、不支持变量替换 4、我讨厌这个单词,老是拼不对……于是就动手写了个Setting类,源码请看这里:https://github.com/looly/common-tools/blob/master/src/main/java/com/baijob/commonTools/Setting.java
其实这个类与Properties类很相似,只不过强化了构造方法,首先看代码:
# **************************************************************# ----- Setting File with UTF8-----# ----- 样例配置文件 -----# **************************************************************bool.key = truechar.key = Astring1 = String of valuestring2 = ${string1}
package com.baijob.commonTools;public class SettingTest { public static void main(String[] args) { Setting setting = new Setting("config/example.setting", "utf8", true); boolean bool = setting.getBool("bool.key"); char char1 = setting.getChar("char.key"); String string = setting.getString("string1"); String string2 = setting.getString("string2"); System.out.println(bool + ", " + char1 + ", " + string + ", " + string2); //当配置文件有改动调用此方法 setting.reload(); }}
首先使用了其中一个最常用的构造方法,第一个参数是相对路径(相对于classes目录),第二个是这个Setting的字符集,第三个则是是否使用变量替换(如果使用,则在构造的时候会做变量 替换),下面几个方法就是获得不同类型的值了,是不是超简单超方便?同样的,默认我们在配置文件中用“#”表示注释,变量用${key}表示变量。当然,变量暂时只能在value中使用。
当然,需要强调的是本类中有很多构造方法,这些构造方法是针对配置文件所处不同位置时设定的:
1、Setting(String pathBaseClassLoader, String charset, boolean isUseVariable) 此方法用于读取配置文件基于classes目录的相对路径,例如Tomcat将class文件放在WEB_INF/classes下,那么给定pathBaseClassLoader值为"./config.setting"表示这个文件在WEB_INF/classes目录下。这样做的好处是配置文件随着项目变动不会影响读取,而且就算项目打成jar包或war包,依旧可以正常读取。2、public Setting(File configFile, String charset, boolean isUseVariable) 此方法传入一个File类,一般new一个File即可,常用语读取绝对路径的配置文件
3、Setting(String path, Class<?> clazz, String charset, boolean isUseVariable) 此方法也是读取相对路径的配置文件,只不过这回相对的是给定的Class。例如给定的Class是com.aaa.bb.AA.class,则给定路径"./config.setting"表示与AA.class同目录下的config.setting文件,也是支持打包读取哦。
4、Setting(URL url, String charset, boolean isUseVariable) 此方法接受一个URL对象,用于读取URL指定的配置文件
5、Setting(Charset charset, boolean isUseVariable) 好吧,如果你不想在一开始的时候就初始化一切,就可以先调这个方法把对象new出来,然后调用load方法去加载配置文件。
第5种构造在什么时候可能用到呢?我想的是你对我的变量定义不满意,例如你发现${key}这种变量名与你的项目的其他东东冲突了,OK,我提供了setVarRegex(String regex)方法来自定义变量的形式。由于变量我是通过正则去匹配的,你也必须给我一个正则的形式,我在注释中是这样规定的:正则只能有一个group表示变量本身,剩余为字符 例如 \$\{(name)\}表示${name}变量名为name的一个变量表示。
现在你知道有时老实点儿遵循规范可以减少很多学习成本和时间,我恨不得你所有的配置文件都在相对路径下,反正我是这么做的。
接下来,解释个方便的好方法:settingToObject(Object object),这个方法是映射配置文件中的键值对给一个对象的,这样的话,假如你这个对象有个方法叫setName(String name),配置文件中有个name=凤姐,那么调用此方法会自动将“凤姐”注入进去(好邪恶……),想想Spring的IOC,我是不是应该改这个方法的名字叫settingToBean呢?不管了,反正能干活就行。
因为是继承自Map,故可以调用set方法保存配置,这时配置只保存在内存中。
最后解释下持久化Setting,有个store方法可以保存Setting为文件,有两个重载方法可以使用相对或绝对路径,但是不能写入jar包中的配置文件。
好了,这个类解释完了,我这有点儿懒,没给出很详细的代码,大家有兴趣的可以去看看源码,如果觉得有用,也可以单独拷贝出来用(这个类依赖FileUtil和net/URLUtil)。
恩……就到这里,大周末的,衣服还没洗……单身屌丝只能靠自己啊~~