config.properties:系統常量、版本號、路徑database.properties:數據庫連接參數log4j.properties:日誌配置redis.properties:緩存配置格式:key=value,註釋用 #。
// 方式一:文件絕對路徑
InputStream in = new BufferedInputStream(new FileInputStream("文件路徑"));
Properties p = new Properties();
p.load(in);
System.out.println(p.getProperty("version"));
// 方式二:類路徑相對路徑(同包下)
InputStream in = PropertiesUtil.class.getResourceAsStream("文件名");
Properties p = new Properties();
p.load(in);
// 方式三:類路徑絕對路徑(從 classpath 根)
InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("文件名");
Properties p = new Properties();
p.load(in);
// 方式四:系統類加載器
InputStream in = ClassLoader.getSystemResourceAsStream("文件名");
Properties p = new Properties();
p.load(in);
| 方式 | 適用場景 | 路徑前綴 |
|---|---|---|
| FileInputStream | 文件系統絕對/相對路徑 | 文件系統路徑 |
| getResourceAsStream | 同包資源 | 相對當前類包 |
| getClassLoader().getResourceAsStream | classpath 根資源 | / 即 classpath 根 |
| ClassLoader.getSystemResourceAsStream | 系統類加載器可見資源 | / 即 classpath 根 |
專為國際化設計,支持 基名_語言_國家.properties 命名規範。
// 方式五:默認 Locale
ResourceBundle rb = ResourceBundle.getBundle("文件名前綴", Locale.getDefault());
System.out.println(rb.getObject("version"));
// 方式六:自定義輸入流
InputStream is = new BufferedInputStream(new FileInputStream("文件路徑"));
ResourceBundle rb = new PropertyResourceBundle(is);
System.out.println(rb.getObject("version"));
ResourceBundle 首次讀取後永久緩存,修改配置文件需重啟 JVM 才能生成效,不適合熱更新場景。
Properties + getClassLoader().getResourceAsStream(),支持 classpath 熱加載(配合監聽器)ResourceBundle,利用其 Locale 解析機制@PropertySource + @Value 或 Environment,框架級支持熱刷新src/main/resources 或 config 目錄
public class PropsUtil {
public static Properties load(String classpath) {
Properties props = new Properties();
try (InputStream is = Thread.currentThread()
.getContextClassLoader().getResourceAsStream(classpath)) {
if (is != null) props.load(is);
} catch (IOException e) {
throw new RuntimeException("載入配置失敗: " + classpath, e);
}
return props;
}
public static String get(Properties props, String key, String def) {
return props.getProperty(key, def);
}
}