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),如同字典中的单词和解释。
- 所有键值对都以字符串形式存储,即使数值类型也需要转换为字符串。
核心特性
- 键值对存储:所有键和值都必须是
String
类型。 - 持久化能力:支持将内存中的键值对保存到文件,或从文件加载数据。
- 线程不安全:与
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 生态中处理配置信息的基石工具,其简洁的设计和强大的功能使其在中小型项目中广受欢迎。通过本文的讲解,读者应能掌握以下核心能力:
- 使用
setProperty
和getProperty
操作键值对。 - 通过
load
和store
方法与文件交互。 - 结合实际案例解决数据库连接等典型场景。
- 处理编码问题和资源路径的优化技巧。
对于追求极致灵活性的开发者,可进一步探索更现代的配置库(如 Apache Commons Configuration 或 Spring 的 @Value
注解),但掌握 Properties 类
的基础仍然是 Java 开发的必经之路。希望本文能成为你配置管理的可靠指南!