当前位置: 首页 > news >正文

配置文件格式 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&#xff0c;即为初始化文件&#xff0c;最早是 Windows 系统配置文件所采用的格式…...

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…...

SpringMvc有几个上下文

你好&#xff0c;我是柳岸花明。 SpringMVC作为Spring框架的重要组成部分&#xff0c;其启动流程和父子容器机制是理解整个框架运行机制的关键。本文将通过一系列详细的流程图&#xff0c;深入剖析SpringMVC的启动原理与父子容器的源码结构。 SpringMVC 父子容器 父容器的创建 …...

k8s部署rabbitmq集群

1 部署集群 1.1 安装 # 创建一个中间件的命名空间 kubectl create namespace middleware # 创建ConfigMap,包含RabbitMQ的配置文件内容 kubectl apply -f rabbitmq-configmap.yaml # 配置用于存储RabbitMQ数据的PersistentVolume&#xff08;PV&#xff09;和PersistentVolum…...

Python利用包pypinyin汉字转拼音(处理多音字)

一、汉字转拼音 在python中将汉字的拼音输出可以采用pypinyin包&#xff0c;一下是简单的demo示例&#xff1a; 默认调用pinyin方法转换时时默认时带声调的&#xff0c;不带声调需要添加“styleStyle.NORMAL”参数。 from pypinyin import pinyin, Styledef pinyin_transfer…...

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…...

解决QEMU无法从非0x80000000处开始执行

解决QEMU无法从非0x80000000处开始执行 1 背景介绍2 问题描述3 原因分析4 解决办法5 踩坑回忆5.1 坑1 - 怀疑设备树有问题5.2 坑2 - 怀疑QEMU中内存未写入成功5.3 QEMU地址空间分析过程 1 背景介绍 在使用NEMU与QEMU做DiffTest的场景下&#xff0c;运行的固件为《RISC-V体系结…...

AI在候选人评估中的作用:精准筛选与HR决策的助力

一、引言 随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到各个行业和领域&#xff0c;人力资源管理&#xff08;HRM&#xff09;亦不例外。在候选人评估的环节中&#xff0c;AI技术以其高效、精准的特性&#xff0c;正在逐步改变着传统的招…...

自动化测试的艺术:Xcode中GUI测试的全面指南

自动化测试的艺术&#xff1a;Xcode中GUI测试的全面指南 在软件开发过程中&#xff0c;图形用户界面&#xff08;GUI&#xff09;测试是确保应用质量和用户体验的关键环节。Xcode&#xff0c;作为苹果的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了一套强大…...

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

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…...

34_YOLOv5网络详解

1.1 简介 YOLOV5是YOLO&#xff08;You Only Look Once&#xff09;系列目标检测模型的一个重要版本&#xff0c;由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名&#xff0c;尤其适合实时应用。YOLOV5在保持高效的同时&#xff0c…...

深入解析Perl的正则表达式:功能、应用与技巧

在编程世界中&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;它能够用于搜索、替换、匹配字符串等操作。Perl语言以其强大的文本处理能力著称&#xff0c;而其正则表达式功能更是其核心特性之一。本文将深入探讨Perl中的正则表达式&#xff0c;包括其基本语法、应…...

【JAVA】Hutool CollUtil.sort 方法:多场景下的排序解决方案

在 Java 开发中&#xff0c;集合的排序是常见需求。Hutool 库的 CollUtil.sort 方法提供了一系列用于排序的实用功能&#xff0c;适用于不同的场景。以下是对几种常见场景及其实现方式的总结&#xff1a; <dependency><groupId>org.dromara.hutool</groupId>…...

Mysql-安装(Linux)

1、下载mysql 切换到/opt/app目录下&#xff0c;执行如下命令&#xff0c;下载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 日志不大随便整&#xff0c;因为vim会把整个日志文件读到内存&#xff0c;大日志文件&#xff08;G级别&#xff09;会造成内存占用过高&#xff0c;影响其他程序&#xff0c;在业务机器上查看日志这样尤其危险 less is more 还…...

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…...

Prometheus监控ZooKeeper

1. 简介 ZooKeeper是一个分布式协调服务,在分布式系统中扮演着重要角色。为了确保ZooKeeper集群的健康运行,有效的监控至关重要。本文将详细介绍如何使用Prometheus监控ZooKeeper,包括安装配置、关键指标、告警设置以及最佳实践。 2. 安装和配置 2.1 安装ZooKeeper Exporter…...

vuepress搭建个人文档

vuepress搭建个人文档 文章目录 vuepress搭建个人文档前言一、VuePress了解二、vuepress-reco主题个人博客搭建三、vuepress博客部署四、vuepress后续补充 总结 vuepress搭建个人文档 所属目录&#xff1a;项目研究创建时间&#xff1a;2024/7/23作者&#xff1a;星云<Xing…...

面试题 17.14.最小K个数

题目&#xff1a;如下图 答案&#xff1a;如下图 /*** 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;//默认左孩子是大的&#xff0c;将其与右孩子比较&am…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...