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 的往返

⚠️ 往返不保证无损:

  1. writeValue 对每种 value 生成的文本形式, 必须是 TextParser 的 value(Value) 方法(:149-166,约 18 行)能识别的 token。 两个方法的长度差距(46 行 vs 18 行)说明 写出的语法种类多于解析器支持的种类。
  2. TextParser 走 Tokenizer + Token.getPattern() 的正则词法,对未列出的 token 直接抛 InvalidTokenException。

所以 /igi save foo.txt 产出的文件 再用 /igi load foo.txt 加载可能失败。 XML / JSON 两对实现则结构对称,往返可靠。

遍历顺序问题

与 XmlPrinter / JsonPrinter 相同: writeLines 遍历 HashMap 类型的 format, 9 个对齐块顺序不保证是枚举声明序。

相关