一、Properties 核心特性
- 键值对存储: 本质是
String键和String值的映射。 - 继承自 Hashtable: 天然线程安全(方法级同步)。
- 配置文件专精:
-
load(InputStream/Reader): 从.properties文件加载键值对。store(OutputStream/Writer, String comments): 保存至.properties文件,支持注释。loadFromXML(InputStream),storeToXML(OutputStream, String comment): 支持 XML 格式配置读写。
- 类型安全访问:
String getProperty(String key),String getProperty(String key, String defaultValue),Object setProperty(String key, String value)。
二、源码解析关键点
- 继承结构:
Properties -> Hashtable -> Dictionary -> Object - 线程安全: 关键方法(如
load,store,getProperty,setProperty)使用synchronized修饰。 - 文件解析:
load方法最终调用load0进行行解析,处理转义字符 (\,\t,\n等)、空格和注释 (#,!)。
三、实战代码示例
示例 1:基础读写 .properties 文件
import java.io.*;
import java.util.Properties;
public class BasicPropertiesDemo {
public static void main(String[] args) throws IOException {
Properties props = new Properties();
// 1. 写入Properties (内存操作)
props.setProperty("db.url", "jdbc:mysql://localhost:3306/mydb");
props.setProperty("db.user", "admin");
props.setProperty("db.password", "secret123");
// 2. 保存到文件 (UTF-8编码避免中文乱码)
try (FileOutputStream fos = new FileOutputStream("config.properties");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")) {
props.store(osw, "Database Configuration"); // 添加注释
}
// 3. 从文件加载
Properties loadedProps = new Properties();
try (FileInputStream fis = new FileInputStream("config.properties");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8")) {
loadedProps.load(isr);
}
// 4. 读取并使用属性 (带默认值)
String dbUrl = loadedProps.getProperty("db.url", "jdbc:default:url");
String maxConn = loadedProps.getProperty("db.max.connections", "10"); // 使用默认值
System.out.println("DB URL: " + dbUrl);
System.out.println("Max Connections: " + maxConn);
}
}
示例 2:读写 XML 格式配置
import java.io.*;
import java.util.Properties;
public class XmlPropertiesDemo {
public static void main(String[] args) throws IOException {
Properties xmlProps = new Properties();
xmlProps.setProperty("app.name", "Super Config Tool");
xmlProps.setProperty("app.version", "2.0");
xmlProps.setProperty("logging.level", "DEBUG");
// 保存为 XML 文件
try (FileOutputStream fos = new FileOutputStream("config.xml")) {
xmlProps.storeToXML(fos, "Application Settings", "UTF-8");
}
// 从 XML 文件加载
Properties loadedXmlProps = new Properties();
try (FileInputStream fis = new FileInputStream("config.xml")) {
loadedXmlProps.loadFromXML(fis);
}
System.out.println("App Name: " + loadedXmlProps.getProperty("app.name"));
}
}
四、应用场景与最佳实践
- 典型场景: 数据库连接配置、应用参数设置、国际化资源文件 (
ResourceBundle底层常基于Properties)。 - 最佳实践:
-
- 明确编码: 读写文件时务必指定字符编码 (如 UTF-8),避免中文乱码。
- 善用默认值:
getProperty(key, defaultValue)提升健壮性。 - 资源关闭: 使用 Try-with-Resources 确保
InputStream/OutputStream正确关闭。 - 线程安全注意: 虽然同步安全,但在极高并发下可能成为瓶颈,需评估。
- 敏感信息: 避免将密码等明文存储在
Properties文件中,应使用加密方案或专用秘钥管理服务。
五、总结
Properties 作为 Java 集合框架中专为配置而生的元老,凭借其简洁的键值模型、便捷的文件集成能力(尤其是 XML 支持)和线程安全性,在配置管理领域依然占据重要地位。掌握其核心 API、理解文件交互机制及编码注意事项,是 Java 开发者高效管理应用配置的基础技能。在微服务和云原生架构下,虽涌现出更多配置中心方案,但 Properties 在简单应用、遗留系统或本地开发中仍不可或缺。
Java集合Properties深度解析与应用

被折叠的 条评论
为什么被折叠?



