信步拾遺之Properties配置文件讀取方式

經常使用的讀取方式有ResourceBundle和Properties,二者的區別在於ResourceBundle一般是用於國際化的屬性配置文件讀取,Properties則是通常的屬性配置文件讀取。java

1、ResourceBundle方式

實例:ide

image

關鍵代碼:spa

package com.alfred.main;

import java.util.Locale;
import java.util.ResourceBundle;

public class ResourceBundleMain {
	public static void main(String[] args) {
		System.out.println("default:"+Locale.getDefault());
		ResourceBundle resourceBundle0 = ResourceBundle.getBundle("myconfig");
		System.out.println(resourceBundle0.getString("say.hello"));
		System.out.println(resourceBundle0.getString("say.sorry"));
		System.out.println("=================");
		Locale locale1 = new Locale("zh", "CN");
		ResourceBundle resourceBundle1 = ResourceBundle.getBundle("myconfig",locale1);
		System.out.println(resourceBundle1.getString("say.hello"));
		System.out.println(resourceBundle1.getString("say.sorry"));
		System.out.println("=================");
		Locale locale2 = new Locale("en", "US");
		ResourceBundle resourceBundle2 = ResourceBundle.getBundle("myconfig",locale2);
		System.out.println(resourceBundle2.getString("say.hello"));
		System.out.println(resourceBundle2.getString("say.sorry"));
	}
}
ResourceBundleMain.java
image

image

image

運行Main,打印結果以下:日誌

default:zh_CN
你好(zh_CN)
對不起(zh_CN)
=================
你好(zh_CN)
對不起(zh_CN)
=================
hello(en_US)
sorry(en_US)

能夠看到,咱們讀取的是對應國際化後綴的配置文件,命名格式爲:配置文件名_語言代碼_國家代碼.properties,在沒有加」語言代碼_國家代碼」的狀況下ResourceBundle默認讀取的是系統所使用地區碼的配置文件,例子中,系統默認爲zh_CN,因此讀取的就是zh_CN結尾的配置文件。code

若是刪除myconfig_zh_CN.properties文件,則打印結果以下:對象

default:zh_CN
你好(default)
對不起(default)
=================
你好(default)
對不起(default)
=================
hello(en_US)
sorry(en_US)

須要注意的是,在沒指定配置文件路徑的狀況下,ResourceBundle讀取的文件路徑是classpath下。因此若是將myconfig.properties和myconfig_zh_CN.properties文件移動到com.alfred.main包下,那麼就沒法讀取到文件,報錯:Can't find bundle for base name myconfig, locale zh_CN。blog

image

這時,須要加上文件路徑,則能夠正常讀取get

ResourceBundle resourceBundle0 = ResourceBundle.getBundle("com.alfred.main.myconfig");

實例中ResourceBundle使用到了Locale類,Locale對象表示了特定的地理、政治和文化地區。須要Locale來執行其任務的操做稱爲語言環境敏感的操做,它使用Locale爲用戶量身定製信息。例如,顯示一個數值就是語言環境敏感的操做,應該根據用戶的國家、地區或文化的風俗/傳統來格式化該數值。it

可使用此類中的構造方法來建立Locale:
Locale(String language)
Locale(String language, String country)
Locale(String language, String country, String variant)io

建立完Locale後,就能夠查詢有關其自身的信息。使用getCountry可獲取ISO國家代碼,使用getLanguage則獲取ISO語言代碼。可用使用getDisplayCountry來獲取適合向用戶顯示的國家名。一樣,可用使用getDisplayLanguage來獲取適合向用戶顯示的語言名。有趣的是,getDisplayXXX方法自己是語言環境敏感的,它有兩個版本:一個使用默認的語言環境做爲參數,另外一個則使用指定的語言環境做爲參數。

Locale locale1 = new Locale("zh", "CN");
System.out.println(locale1.getCountry());
System.out.println(locale1.getDisplayCountry());
System.out.println(locale1.getLanguage());
System.out.println(locale1.getDisplayLanguage());
Locale locale2 = new Locale("en", "US");
System.out.println(locale1.getDisplayCountry(locale2));
System.out.println(locale1.getDisplayLanguage(locale2));

打印結果:

CN
中國
zh
中文
China
Chinese

 

2、Properties方式

關鍵代碼:

package com.alfred.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

public class PropertiesMain {
	/**
	 * 根據Key讀取Value
	 *
	 * @param filePath
	 * @param key
	 * @return
	 */
	public static String getValueByKey(String filePath, String key) {
		Properties pps = new Properties();
		InputStream in = null;
		try {
			// in = new BufferedInputStream(new FileInputStream(filePath));
			in = PropertiesMain.class.getResourceAsStream(filePath);
			pps.load(in);
			String value = pps.getProperty(key);
			System.out.println(key + " = " + value);
			return value;
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 讀取Properties的所有信息
	 *
	 * @param filePath
	 * @throws IOException
	 */
	public static void getAllProperties(String filePath) throws IOException {
		Properties pps = new Properties();
		InputStream in = PropertiesMain.class.getResourceAsStream(filePath);
		pps.load(in);
		Enumeration en = pps.propertyNames(); // 獲得配置文件的名字

		while (en.hasMoreElements()) {
			String strKey = (String) en.nextElement();
			String strValue = pps.getProperty(strKey);
			System.out.println(strKey + "=" + strValue);
		}
	}

	/**
	 * 寫入Properties信息
	 *
	 * @param filePath
	 * @param pKey
	 * @param pValue
	 * @throws IOException
	 */
	public static void writeProperties(String filePath, String pKey,
			String pValue) throws IOException {
		Properties pps = new Properties();

		InputStream in = new FileInputStream(filePath);
		// 從輸入流中讀取屬性列表(鍵和元素對)
		pps.load(in);
		OutputStream out = new FileOutputStream(filePath);
		Object setProperty = pps.setProperty(pKey, pValue);
		System.out.println(setProperty);
		// 將此 Properties 表中的屬性列表(鍵和元素對)寫入輸出流
		pps.store(out, "Update " + pKey + " name");
	}

	public static void main(String[] args) throws IOException {
		// 打印當前目錄
		// System.out.println(new File(".").getAbsolutePath());
		// 若是使用FileInputStream方式讀取文件流 ./config/myconfig.properties
		// 若是使用getResourceAsStream方式讀取文件流 /myconfig.properties
		// String value = getValueByKey("/myconfig.properties", "say.hello");
		// System.out.println(value);
		// getAllProperties("/myconfig.properties");
		// writeProperties("./config/myconfig.properties","long", "2112");
	}

}
PropertiesMain.java
Properties經過文件流讀取配置文件,文件流可使用」類class.getResourceAsStream(配置文件路徑)」方式獲取,也能夠經過FileInputStream的方式獲取。

此外經過Properties類還能夠動態修改配置文件內容。修改時會自動加入修改日誌,咱們能夠指定修改備註內容,以下:

image

Properties讀取的配置文件路徑與ResourceBundle有所不一樣,getResourceAsStream方式讀取classpath路徑下需加上斜槓(例如:/myconfig.properties),而若是使用文件流FileInputStream方式讀取,那麼可使用絕對路徑,若是使用相對路徑的話,則須要肯定當前項目路徑(new File(".").getAbsolutePath()),以後在當前項目路徑下使用相對路徑(./config/myconfig.properties)。

相關文章
相關標籤/搜索