三种格式处理器
基本信息
| 属性 | 值 |
|---|---|
| 三个类 | ForgeConfigHandler / SimpleConfigHandler / INIConfigHandler |
| 各自接口 | 各含 static backup(PrintWriter, List<LocalConfigEntry>, File) 与 static restore(List<LocalConfigEntry>, File) |
| 选择依据 | LocalConfigEntry.getFormat(),读条目的 $format= 参数,缺省 forge |
| 分派点 | EventHandler 的 switch (first.getFormat())(备份与恢复各一处) |
对照表
| 维度 | forge |
simple |
ini |
|---|---|---|---|
| 注释符 | # |
# |
; |
| 分类语法 | { } 嵌套(. 连接) |
{ } 嵌套(. 连接) |
[section] 单层 |
| 分类来源 | 嵌套层级栈 | 嵌套层级栈 | 最近的 [...] 段 |
| 键值分隔 | = |
= |
= |
| 类型前缀 | 有(B: / I: …) |
无(传 "*") |
无(传 "*") |
| 列表支持 | 有(< … >) |
无 | 无 |
| 未知 format | 记 error 跳过整组 | 记 error 跳过整组 | 记 error 跳过整组 |
forge 格式的列表处理
ForgeConfigHandler 独有 isInList / consumeList / discardList 三个状态:
-
备份:遇到
<(属性名以<开头表示列表)时,写出标识符=,随后把列表内每行,分隔输出,并把每行里的,替换成,,(:52-58)——转义列表项本身含逗号的情况;遇到>结束并补一个空行。 -
恢复:命中列表条目时
discardList = true,然后重建整个列表块(ForgeConfigHandler.java:206-244):- 先
writer.println(line)原样输出触发<的那一行; entry.value.replaceAll(",,", "\n")把备份时转义的双逗号还原成换行;- 按
,切分并丢弃最后一个空 token(values.subList(0, size - 1)); - 每个值前打印缩进 = 分类层级数 × 4 空格,再加 4 空格;
- 值内的
\n换回,; - 最后按缩进输出
>收尾。
即列表恢复会丢弃原文件的列表缩进与排版,改用本模组的固定 4 空格缩进规范。
- 先
这是三个 handler 中唯一支持多行值的格式。
三者共同的骨架
backup(...):
- 建
foundProperty[]与notEntries; - 逐字符扫描配置文件,命中
=(或 forge 的<)时用passesProperty匹配条目; - 通配条目再做
notEntries否定检查; - 命中即写
getIdentifier(...) + "=" + value并跳过后续字符; - 收尾对未命中且非
not的条目记warn("... property not found")。
restore(...) 在此之上多一步:
- 先
FileUtils.copyFile出<name>.bak; FileUtils.readLines读全文件,逐行替换=右侧为entry.value;- 任一
IOException→ 从.bak复制回原文件并记 error(Forge/INI/Simple三者都有)。
已知实现问题
1. 同文件混用格式会被按首条处理
分派用的是 first.getFormat()(分组的第一个条目)。因此若 X.cfg 下既有 forge 条目又有 simple 条目,整组都按第一条的格式解析,另一种格式的条目会静默失配。
2. 列表恢复会重排原文件排版
ForgeConfigHandler.restore 命中 < 列表时按上文方式重建列表块,原文件列表项的缩进与空行不保留,统一变成「层级 × 4 空格 + 4 空格」的缩进。若模组作者依赖 Forge 生成的原始排版,diff 会变脏。
3. 分组代表条目决定一切
fileEntries.get(key) 返回的列表中,只有 first 的 file / getFormat() 被使用;其余条目自身的 file 若与 first 不同(理论上不会发生,因为 key 就是 file//format)则会访问错误文件。
限制
- 三个 handler 均为纯文本逐字符解析,不理解 Forge
Configuration的真实写出规则,只按上述形状匹配。 - 不处理
Configuration的版本迁移写入(如version = 11头部),也不校验类型是否匹配(把字符串写进B:项不会报错)。 restore会重写整个文件(连同未命中的行),因此文件内的注释、空行、缩进会被原样保留(按行原样输出),但换行符会被统一为平台默认。- 全部是
static方法,无状态,不可在运行中热重载。
相关条目
- localconfig 保护机制 - 备份 / 恢复的调度流程
- localconfig 条目语法 -
$format=参数与通配规则