Java读取修改.properties文件需用Properties类,读取时用InputStreamReader指定UTF-8避免中文乱码,修改后store会丢失注释和空行;强需求保留格式应选Apache Commons Configuration等第三方库。

Java 中读取和修改 .properties 文件,核心是使用 java.util.Properties 类,它天然支持键值对的加载、读取与保存,且默认以 ISO-8859-1 编码处理(中文需注意转义或指定编码)。
读取 properties 文件(支持中文)
推荐用 InputStream + 指定字符集的方式避免乱码(JDK 9+ 可直接用 load(Reader)):
- 把
properties文件放在类路径下(如src/main/resources/config.properties),用Class.getResourceAsStream()获取流 - 用
InputStreamReader包装流,并显式指定UTF-8编码(否则中文会被错误解析) - 调用
properties.load(reader)加载,之后用getProperty("key")获取值
示例代码:
Properties props = new Properties();
try (InputStream is = MyClass.class.getResourceAsStream("/config.properties");
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
props.load(reader);
}
String dbUrl = props.getProperty("database.url"); // 正确读到中文路径或注释修改并保存 properties 文件(保留原有结构和注释)
Properties 默认的 store() 方法会清空原文件、覆盖写入,且不保留注释和原有空行。若需“最小化修改”,关键点如下:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 不要直接改原文件内容;而是先
load,再setProperty,最后store回去 - 使用
store(OutputStream, String comments),第二个参数是文件头部注释(可为空字符串) - 输出时也建议用
OutputStreamWriter指定UTF-8,并设置autoFlush = true - 注意:原文件中的手写注释(# 或 ! 开头)、空行、键顺序都会丢失——这是
Properties类的设计限制
示例代码:
Properties props = new Properties();
try (InputStream is = Files.newInputStream(Paths.get("config.properties"));
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
props.load(reader);
}
<p>props.setProperty("database.timeout", "30000");</p><p>try (OutputStream os = Files.newOutputStream(Paths.get("config.properties"));
Writer writer = new OutputStreamWriter(os, StandardCharsets.UTF_8)) {
props.store(writer, "Updated on " + new Date());
}处理中文键或值的注意事项
Properties 文件规范要求键和值中非 ASCII 字符必须用 Unicode 转义(如 \u4f60\u597d),但手动转义麻烦。实际开发中更推荐:
- 统一用
InputStreamReader/OutputStreamWriter+UTF-8显式编码,绕过默认 ISO-8859-1 - 避免在 key 中使用中文(key 建议用英文小写+点号分隔,如
app.name) - 如果必须支持原始格式兼容(如老系统),可用
native2ascii工具预处理,但现代项目基本不需要
进阶:保持注释和格式?用第三方库
若业务强依赖保留注释、空行、键顺序(例如运维配置管理),Properties 类无法满足。此时可考虑:
-
Apache Commons Configuration 2.x:支持带注释的 properties 读写,提供
PropertiesConfiguration - ini4j:轻量,支持注释和 section(虽为 ini 设计,但兼容简单 properties)
- 自定义解析(不推荐):用正则逐行读写,维护成本高,易出错
例如 Commons Configuration 写法更直观:
PropertiesConfiguration config = new PropertiesConfiguration("config.properties");
config.setProperty("log.level", "DEBUG");
config.save(); // 自动保留原有注释和空白

















