拓展阅读

config 配置方式概览-8 种配置文件介绍对比 xml/json/proeprties/ini/yaml/TOML/hcl/hocon

config HCL(HashiCorp Configuration Language) 配置文件介绍

config HCL(HashiCorp Configuration Language) 官方文档翻译

config HOCON(Human-Optimized Config Object Notation)配置文件介绍

config ini 配置文件介绍

config properties 配置文件介绍

toml-01-toml 配置文件介绍

XStream java 实现 xml 与对象 pojo 之间的转换

java 实现 xml 与对象 pojo 之间的转换的几种方式 dom4j/xstream/jackson

YAML-01-yml 配置文件介绍

YAML-02-yml 配置文件 java 整合使用 yamlbeans + snakeyaml + jackson-dataformat-yaml

YAML-03-yml 配置文件介绍官方文档翻译

json 专题系列

toml 配置文件是什么?

TOML(Tom’s Obvious, Minimal Language)是一种用于配置文件的格式,由Tom Preston-Werner创建,目的是设计一种既简洁又明确的数据序列化格式。

TOML旨在成为INI文件的替代品,同时提供比JSON或YAML更清晰的语法和更强的类型支持。

TOML配置文件的特点:

  1. 明确的类型:TOML支持多种数据类型,包括字符串、整数、浮点数、布尔值、日期时间和数组等,并且类型明确,易于识别。

  2. 简洁性:TOML的语法简洁,易于阅读和编写,没有不必要的复杂性。

  3. 易于理解:TOML的设计目标是让配置文件易于人类理解和编辑。

  4. 支持嵌套结构:TOML支持嵌套的表(类似于其他语言中的字典或对象),可以创建复杂的层次结构。

  5. 无继承:与INI文件不同,TOML中的表不支持继承,每个表都是独立的。

  6. 数组支持:TOML支持数组类型,可以轻松定义列表。

  7. 注释:TOML支持以#开始的单行注释。

  8. 键值对:TOML使用键值对来存储数据,键和值之间用等号=分隔。

  9. 文件扩展名:TOML文件通常以.toml为扩展名。

TOML配置文件的语法元素:

  • :TOML中的表类似于其他语言中的字典或对象,用于组织相关的键值对集合。
  • 键值对:键和值之间用等号分隔,键名不包含空格。
  • 数组:数组用于存储有序的数据集合,数组中的元素可以是同一类型。
  • 字符串:TOML支持基本字符串和多行字符串。
  • 整数和浮点数:TOML明确区分整数和浮点数。
  • 布尔值:TOML支持truefalse布尔值。
  • 日期时间:TOML支持ISO8601格式的日期和时间。

TOML配置文件示例:

  [toml]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 这是 TOML 配置文件的示例 # 表的定义 [database] server = "192.168.1.1" ports = [ 8001, 8001, 8002 ] connection_max = 5000 enabled = true # 字符串值 name = "John Doe" # 多行字符串 description = """ This is a TOML file. It is used to configure something. """ # 整数和浮点数值 refresh_interval = 3600 # 1 hour # 布尔值 use_cache = false # 日期时间 dob = 1991-05-28T14:34:42Z # 数组 fruits = ["apple", "banana", "cherry"]

使用场景:

TOML通常用于配置应用程序和系统,特别是在以下场景中:

  • 应用程序配置:用于定义应用程序的配置选项。
  • 依赖管理:例如,Cargo(Rust语言的包管理器)使用TOML文件来定义项目的依赖关系。
  • 版本控制系统:TOML被用作某些版本控制系统的配置文件格式。

工具和库支持:

TOML被多种编程语言的库支持,包括但不限于:

  • Rust:toml-rs
  • Python:toml
  • JavaScript:@iarna/toml
  • Java:toml4j
  • Go:toml

这些库提供了解析和操作TOML配置文件的功能,使得在不同编程环境中使用TOML变得容易。

总的来说,TOML是一种简洁、明确且易于使用的配置文件格式,特别适合需要明确类型和结构化数据的配置场景。

它的设计哲学是简单性和明确性,使其成为配置文件管理的理想选择。

toml 为什么被设计?

TOML(Tom’s Obvious, Minimal Language)被设计的初衷是为了提供一个既简洁又明确的配置文件格式。

它由GitHub的联合创始人Tom Preston-Werner创建,目的是为了解决当时流行的配置文件格式(如INI、XML、YAML和JSON)存在的一些问题。

以下是TOML被设计的原因以及它的一些优缺点:

设计初衷:

  1. 明确的类型:TOML设计了明确的数据类型,如字符串、整数、浮点数、布尔值和日期,使得配置文件中的值类型清晰,易于解析。

  2. 避免不必要的复杂性:与YAML和XML等格式相比,TOML避免了不必要的复杂性,使得配置文件更易于编写和理解。

  3. 易于解析:TOML的设计使得它容易被计算机解析,同时保持了对人类的友好性。

  4. 支持嵌套结构:TOML支持表(table)的嵌套,允许创建层次化的数据结构,这有助于组织复杂的配置数据。

  5. 避免继承和合并:TOML不支持INI文件中的继承或合并概念,每个表是独立的,这简化了配置文件的结构。

  6. 设计简洁:TOML的设计哲学是“最小化”,避免不必要的特性,专注于提供核心的配置功能。

优点:

  1. 类型安全:TOML强制类型定义,有助于在解析阶段捕捉错误。

  2. 简洁性:TOML的语法简洁,没有冗余,易于学习和使用。

  3. 结构清晰:支持嵌套的表结构,有助于组织和维护复杂的配置。

  4. 易于阅读和编写:TOML的设计易于人类阅读和编写,同时结构化的特性也便于编辑。

  5. 广泛的库支持:TOML得到了多种编程语言的库支持,易于集成到不同的项目中。

  6. 明确的规范:TOML有一个清晰的规范,易于实现和维护。

缺点:

  1. 社区和普及度:相比于JSON或YAML,TOML的社区和普及度较小。

  2. 学习曲线:尽管TOML设计简洁,但对于习惯于其他配置文件格式的用户来说,可能存在一定的学习曲线。

  3. 功能限制:TOML不支持一些高级功能,如YAML的锚点和别名,或者JSON的模式验证。

  4. 解析器性能:由于TOML是一种较新的格式,某些语言的TOML解析器可能不如成熟的JSON或YAML解析器性能好。

  5. 缺乏高级数据结构:TOML不支持列表推导或复杂的数据结构操作,这可能限制了其在某些高级用例中的应用。

toml 如何使用?

TOML(Tom’s Obvious, Minimal Language)是一种流行的配置文件格式,常用于配置应用程序和系统。

以下是一些TOML配置文件的常见使用例子:

1. 应用程序配置

  [toml]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 应用配置文件 example.toml [application] name = "MyApp" version = "1.0.0" debug = true [application.server] host = "127.0.0.1" port = 8080 [application.database] user = "admin" password = "secret"

2. 依赖管理

在某些编程语言中,TOML用于定义项目的依赖关系,如Rust的Cargo。

  [toml]
1
2
3
4
5
6
7
8
9
10
# 依赖配置文件 Cargo.toml [package] name = "myproject" version = "0.1.0" authors = ["Author Name <author@example.com>"] [dependencies] rand = "0.8.0" serde = { version = "1.0", features = ["derive"] }

3. 包管理器配置

  [toml]
1
2
3
4
5
6
7
8
9
10
11
# 包管理器配置文件 package.toml [package] name = "examplepkg" version = "1.2.3" description = "An example package" license = "MIT" maintainer = "Your Name <your.email@example.com>" [dependencies] libfoo = ">=1.0.0"

4. 系统配置

  [toml]
1
2
3
4
5
6
7
8
9
# 系统配置文件 system.toml [system] timezone = "UTC" language = "en_US.UTF-8" [system.network] hostname = "examplehost" ip_address = "192.168.1.100"

5. 用户偏好设置

  [toml]
1
2
3
4
5
6
7
8
9
# 用户偏好设置文件 preferences.toml [user] name = "John Doe" theme = "dark" [user.interface] font_size = 14 resolution = "1920x1080"

6. API配置

  [toml]
1
2
3
4
5
6
7
8
# API配置文件 api.toml [api] endpoint = "https://api.example.com" timeout = 30 [api.auth] token = "abc123"

7. 数据库连接配置

  [toml]
1
2
3
4
5
6
7
8
9
# 数据库连接配置文件 db.toml [database] type = "postgresql" host = "localhost" port = 5432 user = "dbuser" password = "dbpassword" dbname = "mydatabase"

8. 环境变量配置

  [toml]
1
2
3
4
5
# 环境变量配置文件 env.toml [environment] production = true log_level = "info"

9. 多语言支持

  [toml]
1
2
3
4
5
6
7
8
9
# 多语言支持配置文件 i18n.toml [[languages]] code = "en" name = "English" [[languages]] code = "fr" name = "Français"

10. 项目构建配置

  [toml]
1
2
3
4
5
6
7
8
9
# 项目构建配置文件 build.toml [build] target = "x86_64-unknown-linux-gnu" release = true [build.options] optimize = true strip = true

java 如何解析 toml 文件?

以下是几种常用的Java库以及如何使用它们来解析TOML配置文件的示例:

1. toml4j

toml4j是一个用于解析TOML文件的Java库。以下是使用toml4j库的基本步骤:

  1. 添加依赖:在你的项目中添加toml4j的依赖项。如果你使用Maven,可以在pom.xml文件中添加如下依赖项:

      [xml]
    1
    2
    3
    4
    5
    <dependency> <groupId>com.moandjiezana.toml</groupId> <artifactId>toml4j</artifactId> <version>0.7.2</version> <!-- 使用最新版本 --> </dependency>
  2. 解析TOML文件:使用toml4j提供的API来加载和解析TOML文件。

      [java]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import com.moandjiezana.toml.Toml; import com.moandjiezana.toml.TomlParseResult; public class TomlParserExample { public static void main(String[] args) { try { // 创建TOML解析器对象 Toml toml = new Toml(); // 加载TOML文件 TomlParseResult tomlParseResult = toml.read(new File("config.toml")); // 获取解析结果 TomlTable tomlTable = tomlParseResult.getTable(); // 访问配置项 String value = tomlTable.getString("key"); System.out.println("Value: " + value); } catch (Exception e) { e.printStackTrace(); } } }

2. Jackson-dataformat-toml

Jackson提供了一个用于处理TOML文件的数据格式模块jackson-dataformat-toml。以下是使用该模块的步骤:

  1. 添加依赖:在项目中添加Jackson的TOML模块依赖。

      [xml]
    1
    2
    3
    4
    5
    <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-toml</artifactId> <version>2.13.0</version> <!-- 使用最新版本 --> </dependency>
  2. 解析TOML文件:使用ObjectMapper结合TOML工厂来读取和解析TOML文件。

      [java]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.toml.TomlMapper; public class JacksonTomlParserExample { public static void main(String[] args) { try { ObjectMapper mapper = TomlMapper.builder().build(); // 读取TOML文件 Object config = mapper.readValue(new File("config.toml"), Object.class); // 访问配置项 String value = (String) ((Map) config).get("key"); System.out.println("Value: " + value); } catch (IOException e) { e.printStackTrace(); } } }

3. 使用其他库

除了上述两种库外,还有其他一些库如tomlj等,可以根据项目需求和个人偏好选择合适的库来处理TOML文件。

小结

TOML(Tom’s Obvious, Minimal Language)是一种用于配置文件的轻量级、易读的格式,它具有以下特点:

  1. 简洁明了:TOML的设计直观,易于人类阅读和编写,语法简单。

  2. 明确的数据类型:TOML支持多种基础数据类型,包括字符串、整数、浮点数、布尔值和日期时间,类型明确且易于区分。

  3. 结构化支持:TOML支持嵌套的表(类似于其他语言中的对象或字典),可以清晰地表达层次化的数据结构。

  4. 数组表示:TOML允许数组的表示,可以轻松定义列表类型的数据。

  5. 注释功能:支持以#开始的单行注释,方便添加配置说明。

  6. 键值对:TOML通过键值对存储数据,键和值之间使用等号=连接。

  7. 无继承:与INI文件不同,TOML不支持继承机制,每个表都是独立的。

  8. 文件扩展名:TOML文件通常使用.toml作为文件扩展名。

  9. 多文档支持:一个TOML文件可以包含多个独立的文档块,由---分隔。

TOML的设计哲学是简单性和明确性,使其成为配置文件管理的理想选择。


Toml 是什么?

TOML旨在成为一种极简的配置文件格式,其明显的语义使其易于阅读。

TOML的设计目标是能够明确地映射到哈希表。TOML应该易于解析成各种编程语言中的数据结构。

Q: toml 的官方学习资料及网址

TOML(Tom’s Obvious Minimal Language)的官方网站为:https://toml.io/

TOML的官方GitHub仓库地址为:https://github.com/toml-lang/toml

在这些官方资源上,你可以找到TOML语法的详细规范,学习资料,以及其他有关TOML的文档。

Q: 详细介绍一下 toml 配置文件格式

TOML(Tom’s Obvious Minimal Language)是一种易于阅读和编写的配置文件格式。

它的设计目标是提供一个简单的、直观的配置文件语法,以替代类似INI、JSON和YAML等格式。

TOML 支持各种数据类型(字符串、整数、浮点数、布尔值、日期时间等)和嵌套结构,使得它适用于配置文件、元数据、设置文件等场景。

以下是 TOML 配置文件的一些基本特性和语法规则:

基本语法:

  • TOML 配置文件由键值对(key-value pairs)组成,每个键值对以等号(=)或者冒号(:)分隔。
  • 键值对之间可以使用换行符或者行尾的逗号(,)分隔。
  • 注释以井号(#)开头,后面的内容将被视为注释,直到行尾。

数据类型:

TOML 支持以下基本数据类型:

  • 字符串(String): 字符串可以用单引号或双引号括起来,例如 'hello'"world"
  • 整数(Integer): 例如 42
  • 浮点数(Float): 例如 3.14
  • 布尔值(Boolean): 可以是 truefalse
  • 日期时间(Datetime): 例如 2023-11-01T10:30:00Z,表示UTC时间。

数据结构:

TOML 支持嵌套的数据结构:

  • 表(Table): 使用方括号([])定义表,表可以包含键值对,也可以包含嵌套的表。
      [toml]
    1
    2
    3
    4
    5
    [user] name = "Alice" age = 30 [user.address] city = "New York"
  • 数组(Array): 使用方括号([])定义数组,数组元素可以是任意数据类型,也可以是嵌套的表或数组。
      [toml]
    1
    hobbies = ["reading", "traveling", "swimming"]

多行字符串:

TOML 允许使用三个连续的单引号或双引号表示多行字符串,保留换行符和缩进。

  [toml]
1
2
3
4
5
6
description = ''' This is a multi-line string in TOML. It preserves newlines and indentation. '''

以上是 TOML 配置文件的基本语法和特性。

TOML 的设计目标是提供一种简单而直观的配置文件格式,使得用户可以轻松地阅读和编写配置信息。

java 入门整合

maven 引入

  [xml]
1
2
3
4
5
<dependency> <groupId>com.moandjiezana.toml</groupId> <artifactId>toml4j</artifactId> <version>0.7.2</version> </dependency>

文件的写

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.github.houbb.toml.learn.demo; import com.github.houbb.toml.learn.model.User; import com.moandjiezana.toml.TomlWriter; import java.io.FileWriter; import java.io.IOException; public class TOMLWriterExample { public static void main(String[] args) { // 创建一个User对象 User user = new User(); user.setName("Alice"); user.setAge(30); user.setEmployed(true); // 将User对象写入TOML文件 try (FileWriter writer = new FileWriter("toml4j_output.toml")) { TomlWriter tomlWriter = new TomlWriter(); tomlWriter.write(user, writer); System.out.println("TOML文件已生成。"); } catch (IOException e) { e.printStackTrace(); } } }

生成的效果

  [toml]
1
2
3
name = "Alice" age = 30 isEmployed = true

文件的读

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.github.houbb.toml.learn.demo; import com.moandjiezana.toml.Toml; import java.io.File; public class TOML4JReadExample { public static void main(String[] args) { // 从TOML文件中读取数据 Toml toml = new Toml().read(new File("example.toml")); // 读取单个值 String name = toml.getString("user.name"); int age = toml.getLong("user.age").intValue(); boolean isEmployed = toml.getBoolean("user.isEmployed"); // 读取嵌套表的值 String city = toml.getString("user.address.city"); String zip = toml.getString("user.address.zip"); // 打印读取的数据 System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("Employed: " + isEmployed); System.out.println("City: " + city); System.out.println("ZIP: " + zip); } }

对应的 example.toml

  [plaintext]
1
2
3
4
5
6
7
8
[user] name = "Alice" age = 30 isEmployed = true [user.address] city = "New York" zip = "10001"

对应的结果:

  [plaintext]
1
2
3
4
5
Name: Alice Age: 30 Employed: true City: New York ZIP: 10001

小结

toml 是一个对人类特别友好的语言,但是个人感觉可能还是没有 yaml 这么广泛。