TextPrinter
写回 TXT
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.github.lunatrius.ingameinfo.printer.text.TextPrinter |
| 行数 | 109(三个 printer 里最长) |
| 实现 | IPrinter |
⚠️ 三个 printer 中唯一用 BufferedWriter 流式输出的
(XmlPrinter / JsonPrinter
都是先建完整 DOM / JsonObject 再一次性序列化)。
四个 write 方法
| 方法 | 行 | 作用 |
|---|---|---|
writeLines(BufferedWriter, format) |
:38-47 |
遍历 9 个对齐,写对齐头 + 各行 |
writeLine(BufferedWriter, lines) |
:49-54 |
一行的所有 value |
writeValues(BufferedWriter, values) |
:56-60 |
顺序写各 value |
writeValue(BufferedWriter, value) |
:62-~108 |
单个 value 的文本化(本类最长方法,约 46 行) |
writeValue 需要处理 ValueComplex 的
9 种函数(op / concat / max / min / itemquantity /
trans / formattedtime / icon / file)各自的语法,
无法像 XML 那样「元素名 + 文本」通用处理,所以方法特别长。
⚠️ 流式输出同样没有原子写, 但因逐行 flush,中途失败留下的文件比 XML/JSON 更可能是可读的。
与 TextParser 的往返
⚠️ 往返不保证无损:
writeValue对每种 value 生成的文本形式, 必须是 TextParser 的value(Value)方法(:149-166,约 18 行)能识别的 token。 两个方法的长度差距(46 行 vs 18 行)说明 写出的语法种类多于解析器支持的种类。- TextParser 走
Tokenizer+Token.getPattern()的正则词法,对未列出的 token 直接抛 InvalidTokenException。
所以 /igi save foo.txt 产出的文件
再用 /igi load foo.txt 加载可能失败。
XML / JSON 两对实现则结构对称,往返可靠。
遍历顺序问题
与 XmlPrinter / JsonPrinter 相同:
writeLines 遍历 HashMap 类型的 format,
9 个对齐块顺序不保证是枚举声明序。
相关
- IPrinter - 接口
- TextParser - 对应的输入实现
- ValueComplex -
writeValue需处理的 9 种函数