配置文件格式 INI 快速上手
文章目录
- 1.简介
- 2.语法
- 节
- 键值对
- 注释
- 大小写
- 空白行
- 数据类型
- 字符串 (String)
- 整数 (Integer)
- 浮点数 (Float)
- 布尔值 (Boolean)
- 列表 (List)
- 3.示例
- 4.解析
- 参考文献
1.简介
INI 的全称是 Initialization,即为初始化文件,最早是 Windows 系统配置文件所采用的格式。
有时候,INI 文件也会以不同的扩展名出现,如 .cfg、.conf、或 .txt。但为了可读性,不建议这么做。
因为 INI 并没有一个统一的官方标准,所以这里介绍常见的 INI 文件格式惯例。
2.语法
INI 是一种简单实用且应用广泛的配置文件格式,通常由节、键值对和注释组成。
节
节(Section)是键值对的分组。
一般情况下,节是可选的,不属于任何节的配置项属于全局配置项。
所有的 Section 名称都是独占一行,并且 Section 名字都被方括号 [] 包围。在 Section 声明后的所有键值对都属于该 Section。一个 Section 没有明显的结束标识符,一个 Section 的开始就是上一个 Section 的结束。
[section]
注意,不同节之间的变量可以同名。
正因为没有显式的“节结束符”(例如 XML 的</tag>)。因此,节在语法上不能任意嵌套。必要时,可以将层次结构扁平化,使用分隔符分隔多个节名(通常使用点 . 分隔)来实现嵌套。一级嵌套通常是支持的,称为子节。
[section]
domain = example.com[section.subsection]
foo = bar
键值对
每一个键值对表示一项配置,键与值使用等号分隔。
name=value
注释
注释以分号(;)开头,有一些 INI 管理器也支持使用井号(#)来注释。
; this is comment text
大小写
Windows 中的节和键名是不区分大小写的。大多数 Unix 风格的 INI 解析器也完全不区分大小写。
尽管部分 INI 解析器是支持大小写的,但为了良好的可读性,不建议这么做。
空白行
空白行通常被忽略,可以用来提高可读性。
数据类型
INI 文件格式的设计非常简单,不像 YAML、TOML 等更现代的配置文件格式那样明确支持多种数据类型。通常,INI 文件中的所有数据都是以字符串的形式存储的。然而,不同的解析器可能会尝试根据内容自动识别并转换数据类型。
字符串 (String)
默认情况下,所有值都被视为字符串。字符串值可以包含任何字符。
字符串值通常不需要引号,但在某些情况下可以使用引号(单引号或双引号)括起来。
key1=value1
key2=some text with spaces
key3="quoted string"
整数 (Integer)
一些解析器会尝试将纯数字的值解析为整数。
key1=42
key2=-3
浮点数 (Float)
类似地,包含小数点的数字可能会被解析为浮点数。
[Section]
key1=3.14
key2=-0.001
布尔值 (Boolean)
常见的布尔值表示法包括 true, false, yes, no, 1, 和 0。许多解析器会自动将这些值转换为布尔类型。
key1=true
key2=no
key3=1
key4=0
列表 (List)
虽然 INI 文件格式本身不直接支持列表,但可以通过使用分隔符(如逗号或分号)来模拟列表。某些解析器可以将这些值分割成列表。
key1=value1,value2,value3
key2=item1;item2;item3
3.示例
由于没有官方标准,建议在使用 INI 文件时遵循你所使用的解析器的具体规范,并保持文件结构的简单和一致。
以下是一个综合示例:
; Global section settings
globalKey1=value1[Section1]
# Section1 specific settings
key1=value1
key2=value2[Section2]
key1=value3 # Section2 specific settings
key3=value4
4.解析
下面是一个使用键值对表示的后台服务配置。
; 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
在解析上面的配置时,可以按行读取,然后放到 map 中。
下面以 Go 为例,完成对上面配置文件的解析。
package mainimport ("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 infom := 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 lineif strings.TrimSpace(line) == "" {continue}// ignore comment lineif strings.TrimSpace(line)[0] == ';' || strings.TrimSpace(line)[0] == '#' {continue}// ignore section lineif 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。
package mainimport ("fmt""github.com/spf13/viper"
)func main() {// 设置配置文件的名称和路径viper.SetConfigName("server.ini") // 可以不写文件扩展名viper.AddConfigPath("..") // 在当前目录查找配置文件// 设置配置文件类型为 INIviper.SetConfigType("ini")// 读取配置文件if err := viper.ReadInConfig(); err != nil {fmt.Printf("Error reading config file, %s", err)return}// 获取配置项的值fmt.Println("server.name:", viper.GetString("server.name"))fmt.Println("server.maxconns:", viper.GetInt("server.maxconns"))fmt.Println("server.queuecap:", viper.GetInt("server.queuecap"))fmt.Println("server.queuetimeout:", viper.GetInt("server.queuetimeout"))fmt.Println("log.loglevel:", viper.GetString("log.loglevel"))fmt.Println("log.logsize:", viper.GetString("log.logsize"))fmt.Println("log.lognum:", viper.GetInt("log.lognum"))fmt.Println("log.logpath:", viper.GetString("log.logpath"))
}
运行结果:
server.name: UserProfileServer
server.maxconns: 10000
server.queuecap: 10000
server.queuetimeout: 300
log.loglevel: ERROR
log.logsize: 10M
log.lognum: 10
log.logpath: /usr/local/app/log
参考文献
INI file - wikipedia
Apache Documentation for org.apache.commons.configuration2.INIConfiguration
相关文章:
配置文件格式 INI 快速上手
文章目录 1.简介2.语法节键值对注释大小写空白行数据类型字符串 (String)整数 (Integer)浮点数 (Float)布尔值 (Boolean)列表 (List) 3.示例4.解析参考文献 1.简介 INI 的全称是 Initialization,即为初始化文件,最早是 Windows 系统配置文件所采用的格式…...
基于WebGoat平台的SQL注入攻击
目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素(机密性、完整性、可用性&…...
SpringMvc有几个上下文
你好,我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分,其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图,深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …...
k8s部署rabbitmq集群
1 部署集群 1.1 安装 # 创建一个中间件的命名空间 kubectl create namespace middleware # 创建ConfigMap,包含RabbitMQ的配置文件内容 kubectl apply -f rabbitmq-configmap.yaml # 配置用于存储RabbitMQ数据的PersistentVolume(PV)和PersistentVolum…...
Python利用包pypinyin汉字转拼音(处理多音字)
一、汉字转拼音 在python中将汉字的拼音输出可以采用pypinyin包,一下是简单的demo示例: 默认调用pinyin方法转换时时默认时带声调的,不带声调需要添加“styleStyle.NORMAL”参数。 from pypinyin import pinyin, Styledef pinyin_transfer…...
推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的
目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起,我们不再单独介绍推荐算法的原理,而是开始进入一个新的模块-工程篇。 在工程实践的部分中,我首先介绍的内容是当今最热门的信息流架构。 信息…...
解决QEMU无法从非0x80000000处开始执行
解决QEMU无法从非0x80000000处开始执行 1 背景介绍2 问题描述3 原因分析4 解决办法5 踩坑回忆5.1 坑1 - 怀疑设备树有问题5.2 坑2 - 怀疑QEMU中内存未写入成功5.3 QEMU地址空间分析过程 1 背景介绍 在使用NEMU与QEMU做DiffTest的场景下,运行的固件为《RISC-V体系结…...
AI在候选人评估中的作用:精准筛选与HR决策的助力
一、引言 随着科技的迅猛发展,人工智能(AI)技术已逐渐渗透到各个行业和领域,人力资源管理(HRM)亦不例外。在候选人评估的环节中,AI技术以其高效、精准的特性,正在逐步改变着传统的招…...
自动化测试的艺术:Xcode中GUI测试的全面指南
自动化测试的艺术:Xcode中GUI测试的全面指南 在软件开发过程中,图形用户界面(GUI)测试是确保应用质量和用户体验的关键环节。Xcode,作为苹果的官方集成开发环境(IDE),提供了一套强大…...
uniapp封装请求拦截器,封装请求拦截和响应拦截的方法
首先我们先看一下uni官方给开发者提供的uni.request用来网络请求的api 1 2 3 4 5 6 7 8 9 uni.request({ url: , method: GET, data: {}, header: {}, success: res > {}, fail: () > {}, complete: () > {} }); 可以看到我们每次请求数据的时候都需…...
开局一个启动器:从零开始入坑ComfyUI
前几天刷某乎的时候看到了一位大佬写的好文,可图 IP-Adapter 模型已开源,更多玩法,更强生态! - 知乎 (zhihu.com) 久闻ComfyUI大名,决定试一下。这次打算不走寻常路,不下载现成的一键包了,而是…...
34_YOLOv5网络详解
1.1 简介 YOLOV5是YOLO(You Only Look Once)系列目标检测模型的一个重要版本,由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名,尤其适合实时应用。YOLOV5在保持高效的同时,…...
深入解析Perl的正则表达式:功能、应用与技巧
在编程世界中,正则表达式是一种强大的文本处理工具,它能够用于搜索、替换、匹配字符串等操作。Perl语言以其强大的文本处理能力著称,而其正则表达式功能更是其核心特性之一。本文将深入探讨Perl中的正则表达式,包括其基本语法、应…...
【JAVA】Hutool CollUtil.sort 方法:多场景下的排序解决方案
在 Java 开发中,集合的排序是常见需求。Hutool 库的 CollUtil.sort 方法提供了一系列用于排序的实用功能,适用于不同的场景。以下是对几种常见场景及其实现方式的总结: <dependency><groupId>org.dromara.hutool</groupId>…...
Mysql-安装(Linux)
1、下载mysql 切换到/opt/app目录下,执行如下命令,下载mysql 5.7.38版本。 [rootywxtdb app]# wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 解压安装包 [rootywxtdb app]# tar -zxvf mysql-5.7.38-l…...
如何查看日志
别用 cat cat 把整个日志文件刷屏 慎用 vim 日志不大随便整,因为vim会把整个日志文件读到内存,大日志文件(G级别)会造成内存占用过高,影响其他程序,在业务机器上查看日志这样尤其危险 less is more 还…...
python实现责任链模式
把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理,则直接处理,不能处理则调用下一个节点(也就是当前节点的属性)来进行处理。 Python 实现责任链模式&#…...
Prometheus监控ZooKeeper
1. 简介 ZooKeeper是一个分布式协调服务,在分布式系统中扮演着重要角色。为了确保ZooKeeper集群的健康运行,有效的监控至关重要。本文将详细介绍如何使用Prometheus监控ZooKeeper,包括安装配置、关键指标、告警设置以及最佳实践。 2. 安装和配置 2.1 安装ZooKeeper Exporter…...
vuepress搭建个人文档
vuepress搭建个人文档 文章目录 vuepress搭建个人文档前言一、VuePress了解二、vuepress-reco主题个人博客搭建三、vuepress博客部署四、vuepress后续补充 总结 vuepress搭建个人文档 所属目录:项目研究创建时间:2024/7/23作者:星云<Xing…...
面试题 17.14.最小K个数
题目:如下图 答案:如下图 /*** Note: The returned array must be malloced, assume caller calls free().*/ void AdjustDown(int* a,int n,int root) {int parent root;int child parent * 2 1;//默认左孩子是大的,将其与右孩子比较&am…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
