INI 文件格式概述
INI(Initialization File)是一种轻量级纯文本配置文件格式,起源于 MS-DOS 3.0(1980s),至今仍在桌面应用、嵌入式系统等领域广泛使用。
📋 文件结构
一个完整的 INI 文件由以下三种核心元素构成:
1 2 3 4 5 6 7 8 9 10 11
| ┌─────────────────────────────────┐ │ ; 注释 │ │ 全局键 = 值 │ │ │ │ [节名称] │ │ 键 = 值 │ │ 键 = 值 │ │ │ │ [另一个节] │ │ 键 = 值 │ └─────────────────────────────────┘
|
🔤 基本语法
1️⃣ 节(section)
| 规则 |
说明 |
| 格式 |
方括号 [ ] 包裹,独占一行 |
| 内容 |
括号内至少有一个字符 |
| 大小写 |
通常不区分(取决于解析器) |
| 作用域 |
从声明处到下一个节或文件尾 |
| 默认节 |
文件顶部无节名的区域 |
2️⃣ 键值对(key-value)
| 规则 |
说明 |
| 分隔符 |
= 推荐(兼容性最佳),: 部分支持 |
| 空白处理 |
分隔符两侧空格被修剪 |
| 值类型 |
全部为字符串,数字/布尔需解析器转换 |
| 保留字符 |
键名不能包含 = ; [ ] |
🖥️ 完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
app_name = myapp debug = false
[server] host = 0.0.0.0 port = 8080 enabled = true workers = 4
[database] host = 192.168.1.100 port = 3306 user = admin password = p@ssw0rd
[logging] level = info path = /var/log/app.log format = json
|
⚙️ 高级特性(非标准)
部分解析器支持以下扩展语法:
转义序列
| 序列 |
含义 |
\\\\ |
反斜杠 |
\\" |
双引号 |
\\n |
换行 |
\\t |
制表符 |
\\r |
回车 |
\\xnn |
十六进制 unicode |
数组表示
1 2 3 4
| [application] features[] = logging features[] = caching features[] = validation
|
嵌套节
1 2 3 4 5
| [parent] domain = example.com
[parent.child] nested_key = value
|
重复处理
| 场景 |
行为 |
| 同一节重复键 |
后者覆盖前者 |
| 重复节 |
属性合并处理 |
📐 编写规范
✅ 推荐做法
1 2 3
| [server_config] ; 节名统一风格(下划线/帕斯卡) host = 0.0.0.0 ; 键值分隔用 = port = 8080
|
- 分隔符统一使用
=
- 节名推荐
小写加下划线 或 帕斯卡命名
- 键名推荐
下划线风格
- 全局默认配置放在文件顶部
- 文件编码使用
utf-8
- 敏感信息使用环境变量,不硬编码
❌ 避免做法
- 不要 依赖行尾注释(跨解析器兼容性差)
- 不要 使用超过 2 层的嵌套结构
- 不要 假设值类型——所有值读取后均为字符串
📊 格式对比
| 特性 |
ini |
toml |
yaml |
json |
| 语法复杂度 |
⭐ 极简 |
⭐⭐ 简单 |
⭐⭐⭐ 中等 |
⭐⭐ 简单 |
| 嵌套支持 |
❌ 有限 |
✅ 好 |
✅ 好 |
✅ 好 |
| 原生类型 |
❌ 无 |
✅ 有 |
✅ 有 |
✅ 有 |
| 注释支持 |
✅ ; |
✅ # |
✅ # |
❌ 无 |
| 数组支持 |
⚠️ 非标准 |
✅ 原生 |
✅ 原生 |
✅ 原生 |
| 标准化 |
⚠️ 无标准 |
✅ rfc |
✅ 有标准 |
✅ rfc |
📚 多语言解析库
| 语言 |
推荐库 |
| python |
configparser(标准库) |
| go |
go-ini/ini |
| javascript |
ini(npm) |
| java |
apache commons configuration |
| c/c++ |
inih |
| c# |
iniparser |
🎯 适用场景
| 场景 |
推荐度 |
| 桌面应用简单配置 |
✅ 非常适合 |
| 嵌入式系统配置 |
✅ 轻量高效 |
| 遗留系统维护 |
✅ 必须使用 |
| 跨服务复杂配置 |
❌ 建议 toml/yaml |
| 数据交换格式 |
❌ 建议 json |
| 严格类型校验 |
❌ 建议 toml |
总结: INI 以极简语法和广泛兼容性立足至今,适合轻量键值对配置场景。但缺乏统一标准、无原生类型、不支持复杂嵌套是其局限性。复杂场景建议换用 toml 或 yaml。