一、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
在简单应用、遗留系统或本地开发中仍不可或缺。