Hutool之Properties替代——Setting

前言

對於JDK自帶的Properties讀取的Properties文件,對咱們來講有不少限制,首先是ISO8859-1編碼致使無法加中文的value和註釋(用日本的那個插件在Eclipse裏能夠讀寫,放到服務器上讀就費勁了),再就是不支持變量分組等功能,所以有了Setting類。html

由來

配置文件中使用變量這個需求由來已久,在SpringPropertyPlaceholderConfigurer類就用於在ApplicationContext.xml中使用Properties文件中的變量替換。 分組的概念我第一次在Linux的rsync的/etc/rsyncd.conf配置文件中有所瞭解,發現特別實用具體你們能夠百度。java

而這兩種功能後來我在joddProps纔有所發現,它的這個配置文件擴展類十分強大,甚至支持多行等等功能,原本想直接使用,避免重複造輪子,但是發現不少特性我徹底用不到,並且沒有我須要的便捷功能,因而我便造了Setting這個輪子。mysql

配置文件格式example.setting

<!-- 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

  1. 註釋用#開頭表示,只支持單行註釋,空行和沒法正常被識別的鍵值對也會被忽略,可做爲註釋,可是建議顯式指定註釋。
  2. 鍵值對使用key = value 表示,key和value在讀取時會trim掉空格,因此不用擔憂空格。
  3. 分組爲中括號括起來的內容(例如配置文件中的[demo]),中括號如下的行都爲此分組的內容,無分組至關於空字符分組,即[]。若某個keyname,分組是group,加上分組後的key至關於group.name。
  4. 支持變量,默認變量命名爲 ${變量名},變量只能識別讀入行的變量,例如第6行的變量在第三行沒法讀取,例如配置文件中的${driver}會被替換爲com.mysql.jdbc.Driver,爲了性能,Setting建立的時候構造方法會指定是否開啓變量替換,默認不開啓。

代碼

代碼具體請見com.xiaoleilu.hutool.demo.SettingDemogithub

<!-- 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("\\$\\{(.*?)\\}");
	}
}

對Properties的簡單封裝Props(版本2.0.0開始提供)

對於Properties的普遍使用使我也無能爲力,有時候遇到Properties文件又想方便的讀寫也不容易,因而對Properties作了簡單的封裝,提供了方便的構造方法(與Setting一致),並提供了與Setting一致的getXXX方法來擴展Properties類,Props類繼承自Properties,因此能夠兼容Properties類,具體再也不作介紹,有興趣能夠看下com.xiaoleilu.hutool.Props正則表達式

相關文章
相關標籤/搜索