INI 文件格式概述

INI(Initialization File)是一种轻量级纯文本配置文件格式,起源于 MS-DOS 3.0(1980s),至今仍在桌面应用、嵌入式系统等领域广泛使用。


📋 文件结构

一个完整的 INI 文件由以下三种核心元素构成:

┌─────────────────────────────────┐
│  ; 注释                          │
│  全局键 = 值                      │
│                                 │
│  [节名称]                        │
│  键 = 值                         │
│  键 = 值                         │
│                                 │
│  [另一个节]                       │
│  键 = 值                         │
└─────────────────────────────────┘

🔤 基本语法

1️⃣ 节(section)

[section_name]
规则说明
格式方括号 [ ] 包裹,独占一行
内容括号内至少有一个字符
大小写通常不区分(取决于解析器)
作用域从声明处到下一个节或文件尾
默认节文件顶部无节名的区域

2️⃣ 键值对(key-value)

key = value
key: value
规则说明
分隔符= 推荐(兼容性最佳),: 部分支持
空白处理分隔符两侧空格被修剪
值类型全部为字符串,数字/布尔需解析器转换
保留字符键名不能包含 = ; [ ]

3️⃣ 注释(comment)

; 分号注释 — 标准写法,推荐使用
#  井号注释 — 常见但非所有解析器支持

🖥️ 完整示例

; 应用配置文件
; 全局默认配置区
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 层的嵌套结构
  • 不要 假设值类型——所有值读取后均为字符串

📊 格式对比

特性initomlyamljson
语法复杂度⭐ 极简⭐⭐ 简单⭐⭐⭐ 中等⭐⭐ 简单
嵌套支持❌ 有限✅ 好✅ 好✅ 好
原生类型❌ 无✅ 有✅ 有✅ 有
注释支持;##❌ 无
数组支持⚠️ 非标准✅ 原生✅ 原生✅ 原生
标准化⚠️ 无标准✅ rfc✅ 有标准✅ rfc

📚 多语言解析库

语言推荐库
pythonconfigparser(标准库)
gogo-ini/ini
javascriptini(npm)
javaapache commons configuration
c/c++inih
c#iniparser

🎯 适用场景

场景推荐度
桌面应用简单配置✅ 非常适合
嵌入式系统配置✅ 轻量高效
遗留系统维护✅ 必须使用
跨服务复杂配置❌ 建议 toml/yaml
数据交换格式❌ 建议 json
严格类型校验❌ 建议 toml

总结: INI 以极简语法和广泛兼容性立足至今,适合轻量键值对配置场景。但缺乏统一标准、无原生类型、不支持复杂嵌套是其局限性。复杂场景建议换用 toml 或 yaml。

🔗 相关文档

OpenStack 概述 | OpenStack Keystone详解