對於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正則表達式