INI 文件格式概述
INI(Initialization File)是一种轻量级纯文本配置文件格式,起源于 MS-DOS 3.0(1980s),至今仍在桌面应用、嵌入式系统等领域广泛使用。
📋 文件结构
一个完整的 INI 文件由以下三种核心元素构成:
┌─────────────────────────────────┐
│ ; 注释 │
│ 全局键 = 值 │
│ │
│ [节名称] │
│ 键 = 值 │
│ 键 = 值 │
│ │
│ [另一个节] │
│ 键 = 值 │
└─────────────────────────────────┘
🔤 基本语法
1️⃣ 节(section)
| 规则 | 说明 |
|---|
| 格式 | 方括号 [ ] 包裹,独占一行 |
| 内容 | 括号内至少有一个字符 |
| 大小写 | 通常不区分(取决于解析器) |
| 作用域 | 从声明处到下一个节或文件尾 |
| 默认节 | 文件顶部无节名的区域 |
2️⃣ 键值对(key-value)
| 规则 | 说明 |
|---|
| 分隔符 | = 推荐(兼容性最佳),: 部分支持 |
| 空白处理 | 分隔符两侧空格被修剪 |
| 值类型 | 全部为字符串,数字/布尔需解析器转换 |
| 保留字符 | 键名不能包含 = ; [ ] |
; 分号注释 — 标准写法,推荐使用
# 井号注释 — 常见但非所有解析器支持
🖥️ 完整示例
; 应用配置文件
; 全局默认配置区
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 |
数组表示
[application]
features[] = logging
features[] = caching
features[] = validation
嵌套节
[parent]
domain = example.com
[parent.child]
nested_key = value
重复处理
| 场景 | 行为 |
|---|
| 同一节重复键 | 后者覆盖前者 |
| 重复节 | 属性合并处理 |
📐 编写规范
✅ 推荐做法
[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。
🔗 相关文档
OpenStack 概述
|
OpenStack Keystone详解