对于JDK自带的Properties读取的Properties
文件,对咱们来讲有不少限制,首先是ISO8859-1
编码致使无法加中文的value和注释(用日本的那个插件在Eclipse里能够读写,放到服务器上读就费劲了),再就是不支持变量分组等功能,所以有了Setting类。html
配置文件中使用变量这个需求由来已久,在Spring中PropertyPlaceholderConfigurer
类就用于在ApplicationContext.xml
中使用Properties
文件中的变量替换。 分组的概念我第一次在Linux的rsync的/etc/rsyncd.conf配置文件中有所了解,发现特别实用具体你们能够百度。java
而这两种功能后来我在jodd的Props才有所发现,它的这个配置文件扩展类十分强大,甚至支持多行等等功能,原本想直接使用,避免重复造轮子,但是发现不少特性我彻底用不到,并且没有我须要的便捷功能,因而我便造了Setting
这个轮子。mysql
<!-- lang: shell --> # ------------------------------------------------------------- # ----- Setting File with UTF8----- # ----- 数据库配置文件 ----- # ------------------------------------------------------------- #中括表示一个分组,其下面的全部属性归属于这个分组,在此分组名为demo,也能够没有分组 [demo] #自定义数据源设置文件,这个文件会针对当前分组生效,用于给当前分组配置单独的数据库链接池参数,没有则使用全局的配置 ds.setting.path = config/other.setting #数据库驱动名,若是不指定,则会根据url自动断定 driver = com.mysql.jdbc.Driver #JDBC url,必须 url = jdbc:mysql://fedora.vmware:3306/extractor #用户名,必须 user = root${driver} #密码,必须,若是密码为空,请填写 pass = pass = 123456
配置文件能够放在任意位置,具体Setting类如何寻在在构造方法中提供了多种读取方式,具体稍后介绍。如今说下配置文件的具体格式 Setting配置文件相似于Properties文件,规则以下:git
#
开头表示,只支持单行注释,空行和没法正常被识别的键值对也会被忽略,可做为注释,可是建议显式指定注释。[demo]
),中括号如下的行都为此分组的内容,无分组至关于空字符分组,即[]
。若某个key
是name
,分组是group
,加上分组后的key至关于group.name。代码具体请见com.xiaoleilu.hutool.demo.SettingDemo
github
<!-- lang: java --> package com.xiaoleilu.hutool.demo; import java.io.IOException; import com.xiaoleilu.hutool.CharsetUtil; import com.xiaoleilu.hutool.FileUtil; import com.xiaoleilu.hutool.Setting; /** * Setting演示样例类 * @author Looly * */ public class SettingDemo { public static void main(String[] args) throws IOException { //--------------------------------------------- 初始化 //读取classpath下的XXX.setting,不使用变量 Setting setting = new Setting("XXX.setting"); //读取classpath下的config目录下的XXX.setting,不使用变量 setting = new Setting("config/XXX.setting"); //读取绝对路径文件/home/looly/XXX.setting(没有就建立,关于touch请查阅FileUtil) //第二个参数为自定义的编码,请保持与Setting文件的编码一致 //第三个参数为是否使用变量,若是为true,则配置文件中的每一个key均可以被以后的条目中的value引用形式为 ${key} setting = new Setting(FileUtil.touch("/home/looly/XXX.setting"), CharsetUtil.UTF_8, true); //读取与SettingDemo.class文件同包下的XXX.setting setting = new Setting("XXX.setting", SettingDemo.class, CharsetUtil.UTF_8, true); //--------------------------------------------- 使用 //获取key为name的值 setting.getString("name"); //获取分组为group下key为name的值 setting.getString("name", "group1"); //当获取的值为空(null或者空白字符时,包括多个空格),返回默认值 setting.getStringWithDefault("name", "默认值"); //完整的带有key、分组和默认值的得到值得方法 setting.getStringWithDefault("name", "group1", "默认值"); //若是想得到其它类型的值,能够调用相应的getXXX方法,参数类似 //有时候须要在key对应value不存在的时候(没有这项设置的时候)告知用户,故有此方法打印一个debug日志 setting.getWithLog("name"); setting.getWithLog("name", "group1"); //从新读取配置文件,能够启用一个定时器调用此方法来定时更新配置 setting.reload(); //当经过代码加入新的键值对的时候,调用store会保存到文件,可是会覆盖原来的文件,并丢失注释 setting.setSetting("name1", "value"); setting.store("/home/looly/XXX.setting"); //得到全部分组名 setting.getGroups(); //将key-value映射为对象,原理是原理是调用对象对应的setXX方法 //setting.toObject(); //设定变量名的正则表达式。 //Setting的变量替换是经过正则查找替换的,若是Setting中的变量名和其余冲突,能够改变变量的定义方式 //整个正则匹配变量名,分组1匹配key的名字 setting.setVarRegex("\\$\\{(.*?)\\}"); } }
Props
(版本2.0.0开始提供)对于Properties的普遍使用使我也无能为力,有时候遇到Properties文件又想方便的读写也不容易,因而对Properties作了简单的封装,提供了方便的构造方法(与Setting一致),并提供了与Setting一致的getXXX方法来扩展Properties类,Props
类继承自Properties,因此能够兼容Properties类,具体再也不作介绍,有兴趣能够看下com.xiaoleilu.hutool.Props正则表达式