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

常用配置文件

在软件开发中,配置文件是连接代码静态世界(编译后的代码)和运行时动态环境的桥梁,是管理复杂性和变化的关键工具。选择一个合适的配置文件也是软件开发中的一个关键架构决策。

一、.ini(Initialization File)

.ini文件是一种非常古老且简单的无标准正式规范(但有着广泛共识)的配置格式,应该是最简单的配置文件了,采用简单的节([section])和键值对([key=value])结构,仅支持单层嵌套,适合扁平化的配置。语法极简,易于手动编辑,但仅支持字符串类型。

规范要求:

  • 使用方括号[]括起来,表示一个配置区块(节)。节名独占一行;
  • 键值对(key-value)格式为key = value或‘key : value’,等号(‘=’)更常见,同一节中键需唯一;
  • 节名、键名、值名均为大小写敏感;
  • 允许使用;#开头,注释整行;
  • 没有原生数据类型支持,所有值均为字符串;
  • 一般不允许多行值(ini文件追求简单,建议根据应用进行切割使用单行值);

示例配置:

; 这是一个数据库配置的INI示例
[database]
server = 192.168.1.1
port = 3306
username = root
password = 123456
enable = true[application]
name = My App
log_level = debug ; 这是一个行内注释

注:许多的.conf,.cfg文件本质还是.ini格式,一些简单的自定义配置文件也建议遵循该规范,方便约束和解析。

二、.toml(Tom’s Obvious, Minimal Language))

TOML 旨在成为一个更明确、易于读写的迷你语言。它是 INI 的超集,提供了严格的标准和丰富的原生数据类型。增加了对多层嵌套结构支持,通过表([table])和点分隔符([table.subtable])组织层次结构;原生支持了整数、浮点数、布尔值、日期时间、数组等强类型。

规范要求:

  • 使用方括号[]括起来,表示一个配置区块(节)。节名独占一行;
  • 支持使用‘[table.subtable]’方式定义多层嵌套结构;使用[[array_of_tables]]定义表数组;
  • 键值对(key-value)格式为key = value,同一节中键需唯一;
  • 支持多种数据类型,比如:
    • 字符串:“Hello”, ‘World’,“”“多行字符串”“”
    • 整数:12,32,-56
    • 浮点数:3.14
    • 布尔值:true,false
    • 偏移日期:2025-09-03T09:00:00Z
    • 字面量(不转义):“C:\Users\admin”
    • 数组:[ 1, 2, 3, ]
    • 内联表:inline = { key = “value”, num = 42 }
  • 使用#表示注释;

示例配置:

# 这是一个TOML配置示例
title = "TOML Example"[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true[servers][servers.alpha] # 子表ip = "10.0.0.1"dc = "eqdc10"[[products]] # 表数组
name = "Hammer"
sku = 738594937[[products]]
name = "Nail"
sku = 284758393
color = "gray"

三、.json(JavaScript Object Notation)

JSON文件时一种更加广泛使用的轻量级数据交换格式,源于JavaScript,现已独立于语言。其规范由RFC 8259定义,对JSON的语法、数据类型都做了严格的定义和约束。JSON的设计目标简洁性和语言独立性,使其成为Web API和配置文件的常用格式。

规范要求:

  • 支持键值对集合(对象,用{}表示)和值的有序列表(数组,用[]表示);
  • 键类型只能为字符串,且必须用双引号""包括起来;
  • 值类型可以为字符串、数字、布尔值、数组、对象或null
  • 键值之间使用key : value的方式,键值对(对象)之间使用,分割,最后一个键值对(对象)后不允许尾随逗号;
  • 不支持注释(新规范支持),一般使用特定的key标识注释;

示例配置:

{"database": {"server": "192.168.1.1","ports": [8001, 8001, 8002],"connection_max": 5000,"enabled": true,"credentials": {"username": "root","password": "123456"}},"application": {"name": "My App","log_level": "debug"}
}

四、.yaml(YAML Ain’t Markup Language)

YAML时一种强调人类可读性的数据序列化格式,常用于配置文件和复杂的数据结构。

规范要求:

  • 使用空格缩进(通常两个空格)来表示层级关系;
  • 数据类型支持标量(Scalars)、序列(Sequences)、映射(Mappings)
    • 标量(Scalars):字符串、数字、布尔值等。(字符串可以不用双引号标识)
    • 序列(Sequences):及数组,使用短划线-表示列表项。(短划线-后面必须有一个空格)
    • 映射(Mappings):即对象,使用key: value表示。(冒号`:后面必须有一个空格)
  • 支持多行字符串
    • 使用|符号可以保留字符串中的换行符;
    • 使用>符号可以将字符串中的换行符替换为空格;
    • 使用|+>+可以保留所有尾部空行;
    • 使用|->-可以删除所有尾部空行;

示例配置:

# 这是一个YAML配置示例
database:server: "192.168.1.1"ports:- 8001- 8001- 8002connection_max: 5000enabled: truecredentials:username: rootpassword: "123456" # 数字最好用引号括起来,否则会被解析为整数application:name: My Applog_level: debugdescription: |This is a multi-linestring that preservesline breaks.

五、.xml

XML是一种历史悠久的标记语言,设计宗旨是传输和存储数据,其焦点是数据的结构和含义。它最大的优点就是非常的强大和严谨,但这也是它的缺点:相对其他配置文件会显得特别冗余和复杂。

规范要求:

  • 所有的数据需要被包括在开始标签<tag>和结束标签</tag>中;
  • 标签极其内容称为一个元素。元素可以嵌套;空元素可以用<empty />表示;
  • 开始标签中可以包含属性,格式为name="value"
  • 一般以<?xml version="1.0" encoding="UTF-8"?>开头,表示XML文档;
  • 支持注释:<!-- 这是一个注释 -->

配置示例:

<?xml version="1.0" encoding="UTF-8"?>
<config><database server="192.168.1.1" enabled="true"><ports>8001</ports><ports>8001</ports><ports>8002</ports><connection_max>5000</connection_max><credentials><username>root</username><password>123456</password></credentials></database><application><name>My App</name><log_level>debug</log_level></application>
</config>

六、总结

  • 追求极简和兼容性可以用ini;
  • 对INI配置文件进行增强可以用toml;
  • 方便在机器间(进程间)传递可以优先选择json(代码解析方便,应用很广泛);
  • 配置复杂,并优先保证人类的可读性优先选择yaml;
  • 对结构、格式有严格的要求,侧重数据存储优先选择xml(旧系统使用的多些);
http://www.xdnf.cn/news/1479547.html

相关文章:

  • 去中心化投票系统开发教程 第三章:智能合约设计与开发
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • 算法题-链表03
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • LeetCode 2841.几乎唯一子数组的最大和
  • AI智能体架构全流程全解析
  • [光学原理与应用-432]:非线性光学 - 既然光也是电磁波,为什么不能直接通过电生成特定频率的光波?
  • 打造一款高稳定、低延迟、跨平台RTSP播放器的技术实践
  • 基于FPGA的电梯控制系统设计(论文+源码)
  • 动态内存分配
  • DeepSeek辅助在64位Linux中编译运行32位的asm-xml-1.4程序
  • Day22_【机器学习—集成学习(1)—基本思想、分类】
  • leetcode 215 数组中的第K个最大元素
  • Jupyter Notebook与cpolar:构建跨地域数据科学协作平台
  • 正态分布 - 计算 Z-Score 的 无偏估计
  • 计算机主板上的那颗纽扣电池的作用是什么?
  • OSG中TerrainManipulator(地形适配操纵器)
  • STM32CubeProgrammer软件安装
  • Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析
  • 2023年ASOC SCI2区TOP,改进元启发式算法+考虑医护人员技能水平的家庭健康护理路径规划,深度解析+性能实测
  • 【Redis】缓存的穿透、击穿和雪崩
  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • C++基础知识
  • 《sklearn机器学习——聚类性能指标》Silhouette 系数
  • 用 Hashcat 提取哈希值并找回遗忘的密码:一次实用的尝试
  • 【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察
  • uniapp基础组件概述
  • SPI 三剑客:Java、Spring、Dubbo SPI 深度解析与实践​
  • 【开题答辩全过程】以电商数据可视化系统为例,包含答辩的问题和答案
  • 编辑shell脚本示例练习