博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
common-tools(2)之properties替代者Setting类
阅读量:6356 次
发布时间:2019-06-23

本文共 3034 字,大约阅读时间需要 10 分钟。

  hot3.png

    首先广告自己的工具包 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)。

    恩……就到这里,大周末的,衣服还没洗……单身屌丝只能靠自己啊~~

转载于:https://my.oschina.net/looly/blog/111425

你可能感兴趣的文章
SQL创建索引(转)
查看>>
第十四学 linux内核——进程管理——进程控制块的内容(3)
查看>>
引路蜂地图应用详细解说
查看>>
hdu1023(大数+递推)
查看>>
【Linux_Fedora_应用系列】_2_如何安装视频播放器和视频文件解码
查看>>
关于ps cs5的一些问题
查看>>
谈一个程序员创业的前期投资和成功的可能性
查看>>
【web技术】html特效代码(二)
查看>>
Ubuntu分区方案归总
查看>>
腾讯游戏设计(tgideas.qq.com)回复处CSRF任意换马甲
查看>>
使用POI生成Excel报表
查看>>
Oracle重建临时表空间
查看>>
sql server常有的问题-实时错误'91' 对象变量或with块变量未设置
查看>>
值类型引用类型的区别(转)
查看>>
jsp连接MySQL数据库显示GIS地理数据乱码问题的解决(select AsText(the_geom))
查看>>
销售管理之调拨销售管理
查看>>
系统二级运维之业务单据错误处理
查看>>
Little Sympathy for Bear Stearns : NPR
查看>>
设计模式大杂烩(24种设计模式的总结以及学习设计模式的几点建议)
查看>>
CentOS6.4 配置Haproxy
查看>>