文章目錄
一.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.注意事項
- Properties設計的目的是存儲String類型的key-value鍵值對,但
Properties實際上是從Hashtable派生的,它的設計實際上是有問題的
,但是爲了保持兼容性,現在已經沒法修改了。 - 除了
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類型
表示了,不涉及編碼問題。
五.總結
-
Java集合庫提供的Properties用於讀寫配置文件.properties。.properties文件可以使用UTF-8編碼。
-
可以從
文件系統
、classpath
或其他任何地方
讀取.properties文件。 -
讀寫Properties時,注意
僅使用getProperty()和setProperty()方法
,不要調用繼承而來的get()和put()等方法。
Java的Properties使用及格式定義
Java Properties類使用基礎
Java中getResourceAsStream的用法
getResource和getResourceAsStream
getResourceAsStream的幾種路徑配置