Java读写Toml配置时如何保留注释?求解决方案
解决Toml配置修改后丢失注释的问题
你的问题根源在于toml4j库在解析时仅提取键值对数据,丢弃了注释、空行等格式信息,写入时是基于Map重新生成Toml文本,所以原有注释会丢失。以下两种方案可以解决这个问题:
方案一:使用支持保留注释的Toml库(推荐)
改用tomlj库,它能解析出包含注释、位置信息的抽象语法树(AST),修改键值后可以保留原文件的注释和格式。
依赖配置(Maven)
<dependency> <groupId>org.tomlj</groupId> <artifactId>tomlj</artifactId> <version>1.0.0</version> </dependency>
示例代码
package org.example; import org.tomlj.Toml; import org.tomlj.TomlParseResult; import org.tomlj.TomlTable; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; public class TomljExample { public static void main(String[] args) throws IOException { Path configPath = new File("config.toml").toPath(); List<String> originalLines = Files.readAllLines(configPath); // 解析Toml并保留原始注释和结构 TomlParseResult parseResult = Toml.parse(originalLines); // 修改根级别的test_key parseResult.set("test_key", "0.9"); // 修改server表中的port TomlTable serverTable = parseResult.getTable("server").orElseThrow(); serverTable.set("port", 8081); // 将修改后的内容写回文件,保留原有注释和格式 Files.write(configPath, parseResult.toTomlString().lines().toList()); } }
方案二:手动逐行修改文件(适合简单配置)
如果不想更换库,可以直接读取文件的每一行,定位到要修改的键对应的行,替换值后保留其他行不变。这种方法适合结构不复杂的配置文件。
示例代码
package org.example; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; public class ManualTomlEdit { public static void main(String[] args) throws IOException { Path configPath = new File("config.toml").toPath(); List<String> lines = Files.readAllLines(configPath); List<String> newLines = new ArrayList<>(); String targetKey = "test_key"; String newValue = "0.9"; boolean inServerTable = false; for (String line : lines) { // 处理根级别的键 if (line.startsWith(targetKey + " =")) { newLines.add(targetKey + " = \"" + newValue + "\""); continue; } // 处理server表中的port if (line.trim().equals("[server]")) { inServerTable = true; newLines.add(line); continue; } if (inServerTable && line.startsWith("port =")) { newLines.add("port = 8081"); continue; } // 其他行原样保留 newLines.add(line); } Files.write(configPath, newLines); } }
内容的提问来源于stack exchange,提问作者Kuro
相关产品推荐
相关产品推荐

