文档章节

common-tools(2)之properties替代者Setting类

路小磊
 路小磊
发布于 2013/03/03 16:50
字数 1315
阅读 165
收藏 0

    首先广告自己的工具包 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 = true
char.key = A
string1 = String of value
string2 = ${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)。

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

© 著作权归作者所有

共有 人打赏支持
路小磊

路小磊

粉丝 337
博文 53
码字总数 40548
作品 5
乌海
程序员
私信 提问
Hutool之Properties替代——Setting

前言 对于JDK自带的Properties读取的文件,对我们来说有很多限制,首先是编码导致没法加中文的value和注释(用日本的那个插件在Eclipse里可以读写,放到服务器上读就费劲了),再就是不支持变...

路小磊
2014/08/16
0
0
TypeScript手册翻译系列7-常见错误与Mixins

常见错误 下面列出了在使用TypeScript语言和编译器期间,经常会遇到的一些常见错误。 "tsc.exe" exited with error code 1. 解决方案: 检查文件编码为UTF-8 - https://typescript.codeplex.c...

一配
2015/10/04
632
0
java全栈式WEB开发框架--achieve server

achieve server是一个java全栈式开发框架。是本人在使用spring mvc之后,发现spring mvc很多功能不够 强大和灵活的问题后设计和编写的包涵spring mvc几乎所有功能并加强,用法和接口也比较类...

王传昊
2014/06/06
1K
0
Common Gui Tools 1.1,Java GUI实用小工具集

Common Gui Tools Common Gui Tools 是用java编写,GUI界面的实用小工具集,1.1版有13个小工具: 欢迎您使用并提供改进意见! 下载及使用说明: 下载压缩包common_gui_tools-1.1.zip,解压,...

bs2004
2014/07/03
2.2K
9
Android NDK配置过程中出现的问题

解决问题的终极大发,直接更换版本这个是一定能够成功的。 问题出现总是有原因的,就是原因太多无法解决,那么主要从两个方面解决。第一个是更新操作平台,软件平台之间的版本关系影响很大。...

洋碱
2016/01/19
473
0

没有更多内容

加载失败,请刷新页面

加载更多

撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
14分钟前
0
0
《配电网自动化技术》第一章

写了配电网的组成、历程、难点、存在问题、解决方案,还是蛮好的。尤其是各地建设的系统后续又无法实用化,以及多种终端反而增加了运维工作量等,都是目前切实存在的让大家不停吐槽的内容。

max佩恩
19分钟前
0
0

中国龙-扬科
37分钟前
2
0
使用vuex的state状态对象的5种方式

vuex是一个专门为vue.js设计的状态管理模式,并且也可以使用devtools进行调试。 下面给大家来贴一下我的vuex的结构 下面是store文件夹下的state.js和index.js内容 //state.jsconst state =...

peakedness丶
41分钟前
2
0
NetCore MVC Demo

地址:http://114.116.9.72:5411

whltian
48分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部