INI 文件格式概述

INI 文件格式概述

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


📋 文件结构

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

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────┐
│ ; 注释 │
│ 全局键 = 值 │
│ │
│ [节名称] │
│ 键 = 值 │
│ 键 = 值 │
│ │
│ [另一个节] │
│ 键 = 值 │
└─────────────────────────────────┘

🔤 基本语法

1️⃣ 节(section)

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

2️⃣ 键值对(key-value)

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

3️⃣ 注释(comment)

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

🖥️ 完整示例

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。