Java Properties 类(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Java 开发中,配置信息的管理和读取是一个常见需求。无论是数据库连接参数、日志级别设置,还是第三方 API 的密钥,都需要一种灵活且易于维护的方式进行存储。此时,Java Properties 类 就像一个贴心的配置管家,通过轻量级的键值对形式,帮助开发者高效地读取和管理外部配置文件。本文将从基础概念到实战案例,逐步解析 Properties 类 的核心功能与使用技巧,并通过形象的比喻和代码示例,帮助读者快速掌握这一工具。


Properties 类的基本概念

什么是 Properties 类?

Properties 类 是 Java 标准库中用于处理键值对配置的核心类,它继承自 Hashtable,因此具备键值对存储的特性。它的核心作用是读取和保存 key=value 格式的配置文件,例如常见的 .properties 文件。

形象地说,可以将 Properties 类 比作一个 “字典”

  • 每个键(key)对应一个值(value),如同字典中的单词和解释。
  • 所有键值对都以字符串形式存储,即使数值类型也需要转换为字符串。

核心特性

  1. 键值对存储:所有键和值都必须是 String 类型。
  2. 持久化能力:支持将内存中的键值对保存到文件,或从文件加载数据。
  3. 线程不安全:与 Hashtable 一样,Properties 类不是线程安全的,多线程环境下需自行加锁。

Properties 类的核心方法详解

常用方法分类

Properties 类 的主要方法分为三类:

  • 数据操作:添加、获取、删除键值对。
  • 文件读写:从输入流加载数据,或保存到输出流。
  • 其他功能:如遍历键值对、检查属性是否存在等。

以下表格总结了核心方法及其作用:

方法名作用描述
setProperty(key, value)添加或修改键值对。
getProperty(key)根据键获取值,若不存在则返回 null
load(inputStream)从输入流加载 Properties 数据。
store(outputStream, comments)将数据保存到输出流,并添加注释。
list(PrintStream)将所有键值对以文本形式输出。

方法详解与代码示例

1. 基础操作:添加和获取键值对

通过 setProperty 方法可以向 Properties 对象中添加键值对,而 getProperty 方法用于检索值。

Properties config = new Properties();  
config.setProperty("username", "admin");  
config.setProperty("password", "123456");  

String username = config.getProperty("username");  
System.out.println("Username: " + username); // 输出:Username: admin  

2. 从文件加载配置

使用 load 方法可以从文件或输入流中加载配置。例如,假设存在一个 config.properties 文件:

database.url=jdbc:mysql://localhost:3306/mydb  
database.user=root  

Java 代码示例:

Properties dbConfig = new Properties();  
try (FileInputStream fis = new FileInputStream("config.properties")) {  
    dbConfig.load(fis);  
    String url = dbConfig.getProperty("database.url");  
    System.out.println("Database URL: " + url); // 输出:jdbc:mysql://localhost:3306/mydb  
} catch (IOException e) {  
    e.printStackTrace();  
}  

3. 保存配置到文件

通过 store 方法可以将内存中的 Properties 数据保存到文件。例如:

Properties settings = new Properties();  
settings.setProperty("theme", "dark");  
settings.setProperty("timeout", "30");  

try (FileOutputStream fos = new FileOutputStream("settings.properties")) {  
    settings.store(fos, "User Interface Settings"); // 第二参数是文件头部的注释  
} catch (IOException e) {  
    e.printStackTrace();  
}  

生成的 settings.properties 文件内容:

#User Interface Settings  
theme=dark  
timeout=30  

实际案例:配置数据库连接参数

场景描述

假设需要开发一个 Java 应用,需要连接 MySQL 数据库。为了方便维护,希望将数据库地址、用户名、密码等信息存入 db.properties 文件中,并通过 Properties 类 动态加载。

步骤 1:创建配置文件

在项目目录下新建 db.properties

jdbc.driver=com.mysql.cj.jdbc.Driver  
jdbc.url=jdbc:mysql://localhost:3306/mydb?useSSL=false  
jdbc.username=root  
jdbc.password=root123  

步骤 2:编写 Java 代码

import java.sql.*;  
import java.io.*;  
import java.util.Properties;  

public class DatabaseConnector {  
    public static void main(String[] args) {  
        Properties dbProps = new Properties();  
        try (FileInputStream fis = new FileInputStream("db.properties")) {  
            dbProps.load(fis);  
            String driver = dbProps.getProperty("jdbc.driver");  
            String url = dbProps.getProperty("jdbc.url");  
            String user = dbProps.getProperty("jdbc.username");  
            String password = dbProps.getProperty("jdbc.password");  

            // 加载驱动  
            Class.forName(driver);  
            // 建立连接  
            Connection conn = DriverManager.getConnection(url, user, password);  
            System.out.println("数据库连接成功!");  
            conn.close();  
        } catch (IOException | ClassNotFoundException | SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}  

步骤 3:验证输出

运行代码后,若输出 数据库连接成功!,则表示配置加载和数据库连接均成功。


进阶技巧与常见问题解答

1. 处理编码问题

默认情况下,Properties 类 使用 ISO-8859-1 编码读写文件,这可能导致中文乱码。可通过指定编码格式解决:

// 读取时指定编码  
Properties props = new Properties();  
try (FileInputStream fis = new FileInputStream("zh_config.properties")) {  
    props.load(new InputStreamReader(fis, "UTF-8")); // 使用 UTF-8 编码  
}  

// 保存时指定编码  
try (FileOutputStream fos = new FileOutputStream("zh_config.properties")) {  
    props.store(new OutputStreamWriter(fos, "UTF-8"), "中文配置"); // 使用 UTF-8 编码  
}  

2. 使用类加载器加载资源

若配置文件位于类路径下(如 src/main/resources),可通过 ClassLoader 加载,避免硬编码文件路径:

Properties appProps = new Properties();  
try (InputStream is = DatabaseConnector.class.getClassLoader()  
        .getResourceAsStream("app.properties")) {  
    appProps.load(is);  
} catch (IOException e) {  
    e.printStackTrace();  
}  

3. 默认值的优雅处理

当通过 getProperty 获取值时,若键不存在,可直接返回 null。为了避免空指针异常,推荐使用带默认值的重载方法:

String timeout = props.getProperty("timeout", "10"); // 默认值为 "10"  

常见问题

Q:为什么 Properties 类的键值必须是字符串?
A:这是为了兼容性考虑。若需要存储数值类型,可将其转换为字符串存储,并在读取时手动转回:

// 存储  
props.setProperty("max_retries", "3");  
// 读取  
int retries = Integer.parseInt(props.getProperty("max_retries"));  

Q:如何遍历 Properties 中的所有键值对?
A:可通过 keySet() 方法配合迭代器实现:

for (String key : props.stringPropertyNames()) {  
    System.out.println(key + " = " + props.getProperty(key));  
}  

结论

Java Properties 类 是 Java 生态中处理配置信息的基石工具,其简洁的设计和强大的功能使其在中小型项目中广受欢迎。通过本文的讲解,读者应能掌握以下核心能力:

  1. 使用 setPropertygetProperty 操作键值对。
  2. 通过 loadstore 方法与文件交互。
  3. 结合实际案例解决数据库连接等典型场景。
  4. 处理编码问题和资源路径的优化技巧。

对于追求极致灵活性的开发者,可进一步探索更现代的配置库(如 Apache Commons Configuration 或 Spring 的 @Value 注解),但掌握 Properties 类 的基础仍然是 Java 开发的必经之路。希望本文能成为你配置管理的可靠指南!

最新发布