上一章講了配置文件的基本用法,雖然上一章已經可以解決一些需求,但還不些不足之處。假如,配置文件里面的字符串有一部分需要經常變動,另外一些不需要,上一章的方法就不方便了,所以這章主要講如何在配置文件中使用參數,然后替換字符串里面的參數值。
一、使用類MessageFormat替換配置文件中的參數
MessageFormat
提供了以與語言無關方式生成連接消息的方式。使用此方法構造向終端用戶顯示的消息。
MessageFormat
獲取一組對象,格式化這些對象,然后將格式化后的字符串插入到模式中的適當位置。注:
MessageFormat
不同於其他Format
類,因為MessageFormat
對象是用其構造方法之一創建的(而不是使用getInstance
樣式的工廠方法創建的)。工廠方法不是必需的,因為MessageFormat
本身不實現特定於語言環境的行為。特定於語言環境的行為是由所提供的模式和用於已插入參數的子格式來定義的。
簡單來說MessageFormat是一個字符串格式化類,主要使用它的format()方法來替換一個字符串的參數。
1、配置文件如下:
2、代碼如下:
package test.email; import java.io.IOException; import java.io.InputStream; import java.text.MessageFormat; import java.util.Properties; public class Test { public static void main(String[] args) throws IOException { Properties prop = new Properties(); InputStream in = Test.class.getClassLoader().getResourceAsStream( "emailContent.properties"); prop.load(in); //參數 String params[]={"‘張三’ ","13488888888","70.8"}; //從配置文件中讀取模板字符串替換 String msg=MessageFormat.format(prop.getProperty("text"),params); System.out.println("模板字符串:"+prop); System.out.println("替換后的字符串:"+msg); } }
執行結果是:
模板字符串:{text=尊敬的{0}用戶你好,您的手機號碼{1}已經欠費{2},請盡快充值}
替換后的字符串:尊敬的‘張三’ 用戶你好,您的手機號碼13488888888已經欠費70.8,請盡快充值
注意:配置文件中的占位符{}從0開始,與參數數組下標一一對應!!!
二、MessageFormt的模式
MessageFormat用來格式化一個消息,通常是一個字符串,比如:
String str = "I'm not a {0}, age is {1,number,short}", height is {2,number,#.#};
而MessageFormat可以格式化這樣的消息,然后將格式化后的字符串插入到模式中的適當位置,比如:
將str中的{0}用"pig"替換,{1,number,short}用數字8替換,{2,number,#.#}用數字1.2替換。
那么最終用戶得到的是一個格式化好的字符串"I'm not a pig, age is 8, height is 1.2"。
MessageFormat本身與語言環境無關,而與用戶提供給MessageFormat的模式和用於已插入參數的子格式模式有關,以生成適用於不同語言環境的消息。
MessageFormat模式(主要部分):
FormatElement:
{ ArgumentIndex }
{ ArgumentIndex , FormatType }
{ ArgumentIndex , FormatType , FormatStyle }
FormatType:
number
date
time
choice(需要使用ChoiceFormat)
FormatStyle:
short
medium
long
full
integer
currency
percent
SubformatPattern(子模式)
還以str為例,在這個字符串中:
1、{0}和{1,number,short}和{2,number,#.#};都屬於FormatElement,0,1,2是ArgumentIndex。
2、{1,number,short}里面的number屬於FormatType,short則屬於FormatStyle。
3、{1,number,#.#}里面的#.#就屬於子格式模式。
指定FormatType和FormatStyle是為了生成日期格式的值、不同精度的數字、百分比類型等等