【Java基礎】使用Properties

一.Java中的.properties文件

在編寫Java程序的時經常需要讀寫.properties配置文件。如

# 上次最後打開的文件:
last_open_file=/data/hello.txt
# 自動保存文件的時間間隔:
auto_save_interval=60
  • .properties文件的特點是,它的Key-Value一般都是String-String類型的,因此可以用Map<String, String>來表示它。

  • Java集合庫提供了一個Properties類來表示一組“配置”。由於歷史遺留原因,Properties內部本質上是一個Hashtable但我們只需要用到Properties自身關於讀寫配置的接口。

  • Java默認配置文件.properties爲擴展名,每行以key=value表示,以#號開頭的是註釋

二.讀取配置文件

1.從文件流加載properties

有以下配置文件

last_open_file=/data/hello.txt
auto_save_interval=60
用Properties讀取配置文件,一共有三步:
1. 創建Properties實例;
2. 調用load(),傳入文件流讀取文件;
3. 調用getProperty()根據key民名字獲取配置。
	String file = "setting.properties";
	Properties props = new Properties();
	props.load(new FileInputStream(file ));
	
	String filepath = props.getProperty("last_open_file");
	String interval = props.getProperty("auto_save_interval", "120");

調用getProperty()獲取配置時,如果key不存在,將返回null。可以設置默認值,當key不存在時,就返回默認值。

2.從classPath加載配置文件

  • classpath讀取.properties文件,因爲load(InputStream)方法接收一個InputStream實例,表示一個字節流,它不一定是文件流,也可以是從jar包中讀取的資源流:
    Properties props = new Properties();
    props.load(getClass().getResourceAsStream("/common/setting.properties"));
    

3.從內存讀取一個字節流加載配置文件

	import java.io.*;
	import java.util.Properties;

	public class Main {
    	public static void main(String[] args) throws IOException {
        	String settings = "# test" + "\n" + "course=Java" + "\n" + "last_open_date=2019-08-07T12:35:01";
        	ByteArrayInputStream input = new ByteArrayInputStream(settings.getBytes("UTF-8"));
        	Properties props = new Properties();
        	props.load(input);
	
        	System.out.println("course: " + props.getProperty("course"));
        	System.out.println("last_open_date: " + props.getProperty("last_open_date"));
        	System.out.println("last_open_file: " + props.getProperty("last_open_file"));
        	System.out.println("auto_save: " + props.getProperty("auto_save", "60"));
    	}
	}

執行結果
在這裏插入圖片描述

4.注意事項

  1. Properties設計的目的是存儲String類型的key-value鍵值對,但Properties實際上是從Hashtable派生的,它的設計實際上是有問題的,但是爲了保持兼容性,現在已經沒法修改了。
  2. 除了getProperty()setProperty()方法外,還有從Hashtable繼承下來的get()和put()方法,這些方法的參數簽名是Object,我們在使用Properties的時候,不要去調用這些從Hashtable繼承下來的方法。

三.寫入配置文件

如果通過setProperty()可以修改Properties實例,把配置寫入文件,以便下次啓動時獲得最新配置。

寫入配置文件使用store()方法

Properties props = new Properties();
props.setProperty("url", "http://www.liaoxuefeng.com");
props.setProperty("language", "Java");
props.store(new FileOutputStream("C:\\conf\\setting.properties"), "這是寫入的properties註釋");

四.編碼

  • 早期版本的Java規定 .properties文件編碼是ASCII編碼(ISO8859-1)如果涉及到中文就必須用name=\u4e2d\u6587來表示。從JDK9開始,Java的.properties文件可以使用UTF-8編碼了。

  • 需要注意的是,由於 load(InputStream) 默認總是以ASCII編碼讀取字節流,所以會導致讀到亂碼。 我們需要用另一個重載方法load(Reader reader,String charset)讀取:

    Properties props = new Properties();
    props.load(new FileReader("settings.properties", StandardCharsets.UTF_8));
    

InputStream和Reader的區別是一個是字節流,一個是字符流字符流在內存中已經以char類型表示了,不涉及編碼問題。

五.總結

  1. Java集合庫提供的Properties用於讀寫配置文件.properties。.properties文件可以使用UTF-8編碼。

  2. 可以從文件系統classpath其他任何地方讀取.properties文件。

  3. 讀寫Properties時,注意僅使用getProperty()和setProperty()方法,不要調用繼承而來的get()和put()等方法。

Java的Properties使用及格式定義
Java Properties類使用基礎
Java中getResourceAsStream的用法
getResource和getResourceAsStream
getResourceAsStream的幾種路徑配置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章