1.简介
INI 的全称是 Initialization,即为初始化文件,是 Windows 系统配置文件所采用的存储格式。
有时候,INI 文件也会以不同的扩展名出现,如“.cfg”、“.conf”、或“.txt”。但为了可读性,不建议这么做。
因为 INI 并没有一个统一的标准,所以这里介绍常用的 INI 格式内容。*
2.语法
INI 是一种简单实用的配置文件格式,通常由节、参数和注释组成。
节(Section)是键值对的分组。
所有的 Section 名称都是独占一行,并且 Section 名字都被方括号 [] 包围。在 Section 声明后的所有键值对都属于该 Section。一个 Section 没有明显的结束标识符,一个 Section 的开始就是上一个 Section 的结束。
[section]
注意,不同节之间的变量是可以同名的。
正因为没有显式的“节结束”分隔符(例如 XML 的</tag>
)。因此,节在语法上不能任意嵌套。必要时,可以通过将层次结构扁平化并在节名(通常使用点 . 分隔)来实现嵌套。一级嵌套通常是支持的,称为子节。
[db]
user="admin"
password="admin"
[db.mysql]
server=10.0.0.1
port=3306
[db.redis]
server=10.0.0.2
port=6379
参数使用键值对表示。每一个键值对表示一项配置,键与值使用等号分隔。
name=value
注释以分号(;)开头,有一些 INI 变种也支持使用井号(#)来注释。
; this is comment text
3.示例
例如下面是一个使用键值对表示的后台服务配置。
; server basic conf
[server]
name=UserProfileServer
maxconns=10000
queuecap=10000
queuetimeout=300
# log conf
[log]
loglevel=ERROR
logsize=10M
lognum=10
logpath=/usr/local/app/log
4.解析
在解析上面的配置时,可以按行读取,然后放到 map 中。
下面以 Go 为例,完成对上面配置文件的解析。
package main
import (
"bufio"
"errors"
"fmt"
"io"
"os"
"strings"
)
func ParseConf(confPath string) (map[string]string, error) {
if confPath == "" {
return nil, errors.New("param is ill")
}
f, err := os.Open(confPath)
if err != nil {
return nil, err
}
defer f.Close()
// store config info
m := make(map[string]string)
bfRd := bufio.NewReader(f)
// read by line, the line terminator is '\n'
for {
line, err := bfRd.ReadString('\n')
if err == io.EOF {
return m, nil
}
if err != nil {
return nil, err
}
// ignore blank line
if strings.TrimSpace(line) == "" {
continue
}
// ignore comment line
if strings.TrimSpace(line)[0] == ';' || strings.TrimSpace(line)[0] == '#' {
continue
}
// ignore section line
if strings.TrimSpace(line)[0] == '[' {
continue
}
kv := strings.Split(strings.TrimSpace(line), "=")
if len(kv) == 2 {
m[kv[0]] = kv[1]
}
}
}
func main() {
conf, _ := ParseConf("server.ini")
for k, v := range conf {
fmt.Printf("%v=%v\n", k, v)
}
}
运行结果:
name=UserProfileServer
maxconns=1000
queuecap=10000
queuetimeout=300
loglevel=ERROR
logsize=10M
lognum=10
推荐使用专业的第三方库来完成 INI 的解析,比如 Golang 中强大的 spf13/viper。