Java基础教程(八十四)集合之使用Properties:深度分析Java集合之使用Properties,配置文件之王的硬核揭秘

一、Properties 核心特性

  1. 键值对存储: 本质是 String 键和 String 值的映射。
  2. 继承自 Hashtable: 天然线程安全(方法级同步)。
  3. 配置文件专精:
    • load(InputStream/Reader): 从 .properties 文件加载键值对。
    • store(OutputStream/Writer, String comments): 保存至 .properties 文件,支持注释。
    • loadFromXML(InputStream), storeToXML(OutputStream, String comment): 支持 XML 格式配置读写。
  1. 类型安全访问: String getProperty(String key), String getProperty(String key, String defaultValue), Object setProperty(String key, String value)

二、源码解析关键点

  1. 继承结构: Properties -> Hashtable -> Dictionary -> Object
  2. 线程安全: 关键方法(如 load, store, getProperty, setProperty)使用 synchronized 修饰。
  3. 文件解析: 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"));
    }
}

四、应用场景与最佳实践

  1. 典型场景: 数据库连接配置、应用参数设置、国际化资源文件 (ResourceBundle 底层常基于 Properties)。
  2. 最佳实践:
    • 明确编码: 读写文件时务必指定字符编码 (如 UTF-8),避免中文乱码。
    • 善用默认值: getProperty(key, defaultValue) 提升健壮性。
    • 资源关闭: 使用 Try-with-Resources 确保 InputStream/OutputStream 正确关闭。
    • 线程安全注意: 虽然同步安全,但在极高并发下可能成为瓶颈,需评估。
    • 敏感信息: 避免将密码等明文存储在 Properties 文件中,应使用加密方案或专用秘钥管理服务。

五、总结

Properties 作为 Java 集合框架中专为配置而生的元老,凭借其简洁的键值模型、便捷的文件集成能力(尤其是 XML 支持)和线程安全性,在配置管理领域依然占据重要地位。掌握其核心 API、理解文件交互机制及编码注意事项,是 Java 开发者高效管理应用配置的基础技能。在微服务和云原生架构下,虽涌现出更多配置中心方案,但 Properties 在简单应用、遗留系统或本地开发中仍不可或缺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值