随记
Properties 配置文件:Java 生态的键值格式
介绍 Java Properties 的分隔符、注释、转义、续行与编码 API,比较它与 INI、.env、TOML 和 YAML。
发布于 2026年7月24日
Properties 配置文件:Java 生态的键值格式
Properties 是 Java 平台长期使用的持久化键值格式。每个键和值在 java.util.Properties 中都应是字符串,文件采用简单的逐行结构,常见于 Java 应用、框架配置和资源文件。
它与 .env 一样是扁平键值,但拥有 Java API 明确规定的分隔、转义、续行和编码行为。项目通常使用点号模拟层级,再由框架把字符串转换为目标类型。
一、完整示例
app.name=config-demo
app.debug=false
app.features=search,cache
server.host=127.0.0.1
server.port=8080
database.pool-size=10
点号和连字符只是键名的一部分,并不会自动创建对象。false、8080 和 10 也都是字符串;Spring 等框架可以提供绑定和类型转换,但那属于框架能力,不是 Properties 文件自身的数据类型。
二、常用语法
键和值通常用 = 分隔:
server.port=8080
Java 的标准加载格式也允许 : 或未转义空白作为分隔符:
server.host: 127.0.0.1
log.level INFO
为了减少歧义,新文件最好统一使用 =。# 或 ! 开始注释:
# 本地开发监听地址
server.host=127.0.0.1
行尾使用未转义反斜杠可以续行。下一行开头的空白会被忽略:
app.features=search,\
cache,\
metrics
反斜杠还用于转义特殊字符,例如 \t、\n、\r、\f 和 Unicode 的 \uXXXX。Windows 路径中的反斜杠也要按读取 API 的规则正确转义。
三、编码差异
编码是 Properties 最容易被简化过度的部分:
Properties.load(InputStream)按 ISO-8859-1 读取字节,无法直接表示的字符需要 Unicode 转义。Properties.load(Reader)读取字符流,编码由创建Reader时决定。loadFromXML读取 Properties 的 XML 表示,默认使用 UTF-8。- 某些框架、构建工具和资源包可能另外规定 UTF-8 或自己的加载方式。
因此不能只说“.properties 永远是 ISO-8859-1”或“现代 Java 都自动按 UTF-8”。应明确使用哪个 API 或框架,并用包含中文的真实样本测试。
四、适用场景
Properties 适合:
- Java 平台或框架已经原生要求该格式。
- 配置以扁平字符串为主,点号键足以表达逻辑分组。
- 需要与旧版 Java 软件和成熟工具保持兼容。
- 文件会通过
java.util.Properties或有清晰约定的框架加载。 - 配置量不大,列表和复杂对象较少。
新建的复杂配置若需要数组、对象和明确类型,可评估 TOML 或 YAML;如果参数最终来自部署环境,则使用环境变量更直接。
五、与其他格式对比
| 对比格式 | Properties 的优势 | Properties 的不足 |
|---|---|---|
| INI | Java API 行为明确,点号键与 Java 框架契合 | 没有 section,视觉分组较弱 |
.env |
转义、续行和 Java 加载规则更清楚 | 不会自动成为进程环境变量 |
| TOML | Java 兼容性成熟、文本非常简单 | 没有原生类型、数组和真正的表 |
| YAML | 简单键值更稳定,不受缩进影响 | 复杂对象和重复结构需要应用自行编码 |
Properties 也可以保存为特定 XML 结构,但这仍是 Properties API 的另一种持久化形式,不等于任意 XML 配置。
六、常见错误与安全提醒
- 把所有值视为字符串,由应用明确转换整数、布尔值和列表。
- 避免重复键。后读取的值通常会替换已有值,容易隐藏配置错误。
- 统一分隔符和命名风格。虽然标准加载器接受多种分隔方式,混用会降低可读性。
- 正确处理反斜杠。路径、续行和转义相互影响,修改后应由真实加载器验证。
- 明确字符读取 API,特别是包含中文、Emoji 或其他非 ASCII 字符时。
- 不要把密码和令牌提交到普通 Properties 文件。使用环境变量、受控外部文件或平台秘密管理能力。
- 框架行为单独记录。占位符展开、配置覆盖和类型绑定都可能不是标准
Properties的行为。
七、选型建议
如果 Java 框架已经把 Properties 作为稳定入口,继续使用通常成本最低。保持键名清晰、类型转换集中、编码明确,并提供无秘密示例文件即可。
当配置逐渐出现嵌套对象、复杂列表和大量类型约束时,应评估框架支持的 YAML 或其他结构化格式;不要继续在单个字符串中叠加越来越复杂的自定义语法。
八、官方资料
上一篇:.env 文件:以环境变量承载运行配置
返回总览:常用配置文件总览与选型指南