Starsector Nihilism Guidance
首页
GitHub 项目
首页
GitHub 项目
  • 首页
  • 基础及舰船相关
    • MOD 骨架和入口文件
    • 制作一艘基本舰船
    • 制作一艘航母与战机
    • 制作一艘相位舰
    • 制作火炮、光束与导弹
    • 为舰船加入内置武器、船插与战机
    • 补充描述文本
  • 无需入门的代码修改
    • 以船插为例初步熟悉代码
    • 制作完整船插
    • 制作最小战术系统
    • 为武器加入命中与光束特效
  • 势力与生涯星系
    • 注册一个势力
    • 配置势力舰队
    • 制作 MOD 入口类的最基础适配
    • 制作一个生涯星系
    • 补完描述文本
  • 战役与无代码对象
    • 制作测试战役装配
    • 为模拟战与标题画面加入装配
    • 为舰船加入外观风格
    • 制作一艘模块船
    • 制作一种星体类型
    • 制作一个自定义实体
  • 音频资源与播放
    • 准备 OGG 音频资源
    • 注册音频资源
    • 为游戏对象加入音频
  • Java 工程化
    • 确认 Java 与编译依赖
    • 迁移代码文件到 src
    • 配置 Gradle 工程
    • 构建 JAR 并声明产物
  • 全局服务
    • 制作 MOD 入口类
    • 使用 Global 访问游戏服务
    • 读取设置
    • 调用声音播放器
    • 记录和定位 MOD 日志
  • 战斗运行时
    • 读取战斗引擎状态
    • 读取战斗对象
    • 制作每帧战斗插件
    • 修改舰船数值
    • 配置武器脚本
    • 配置战斗监听器
    • 制作分层渲染插件
  • 战斗内容扩展
    • 详解舰船插件
    • 详解战术系统
    • 详解武器动画
  • 生涯世界与基础服务
    • 读取生涯世界状态
    • 构建生涯地点
    • 配置生涯势力
    • 放置生涯实体
  • 生涯舰队与舰队成员
    • 生成生涯舰队
    • 管理舰队中的成员
    • 舰队状态的重算过程
    • 维护舰队成员状态
    • 读取并修改舰船装配
  • 市场与商品
    • 创建生涯市场
    • 读写货舱内容
    • 注册市场商品
    • 实现专用子市场
    • 制作专用产业
    • 注册特殊物品
    • 实现市场条件
  • 人物与技能
    • 配置人物基础
    • 让人物承担角色
    • 制作角色技能
  • 生涯脚本与情报事件
    • 编写生涯逐帧脚本
    • 监听生涯事件
    • 选择生涯插件
    • 管理舰队活动情报
  • 酒吧事件与任务
    • 组织生涯交互对话
    • 实现对话插件
    • 接入酒吧事件
    • 构建阶段任务
    • 接入酒吧任务
  • Rules 系统、命令与内存
    • 组织 Rules 规则表
    • 编排 Rules 对话
    • 接入 Rules 生涯场景
    • 编写 Rules 命令
    • 使用 MemoryAPI 保存状态
  • 文件读取与写入
    • 读取 MOD 内文本
    • 读取 MOD 内 JSON 文件
    • 读取 MOD 内 CSV
    • 读写 common 数据
    • 实现本地化机制
  • 常用依赖库
    • 接入常用依赖库
    • 使用 LazyLib 几何工具
    • 使用 LazyLib 查询战场
    • 使用 LazyLib 保存公共 JSON
    • 注册 GraphicsLib 光照数据
    • 创建 GraphicsLib 动态光源
    • 制作 GraphicsLib 纹理映射
    • 配置 MagicLib 自动尾迹
    • 创建 MagicLib 运行时尾迹
    • 配置 MagicLib 数据赏金
    • 使用 MagicLib 辅助生涯开发
    • 使用 MagicLib 战斗小工具
  • 可选依赖与 Nexerelin
    • 接入可选依赖
    • 登记 Nexerelin 势力与外交配置
    • 配置 Nexerelin 的两种星区开局
    • 配置 Nexerelin 战略 AI 与扩张规模
    • 登记 Nexerelin 地面战单位与产业
    • 为 Nexerelin 特遣队添加命名与事件响应
    • 制作即时生效的 LunaLib 设置面板
  • 着色器与渲染
    • 使用 Java OpenGL
    • 使用 GLSL 进阶
    • 使用 VBO 和 VAO 保存顶点
    • 使用 SSBO 传递参数
    • 使用实例化进行绘制
    • 选择 BoxUtil 渲染方案

读取 MOD 内文本

说明文字、模板和可调整的数据都可以随 MOD 单独发布,代码在需要时取得内容。本节从一份工坊说明开始,用 SettingsAPI.loadText 在应用加载时读回它,再区分默认来源与指定 MOD 的读取方式。

本节预期阅读时间:~12 分钟。

本节预期操作时间:~25 分钟。

学习目标

完成后,您将能够:

  • 说明主动读取 MOD 文件对数据组织和迭代的作用;
  • 使用 SettingsAPI.loadText 读取 MOD 内文本;
  • 写出 MOD 根目录相对路径和 / 分隔规则;
  • 区分单参读取与 modId 限定读取;
  • 从路径错误、BOM 和 MOD ID 错误定位文本读取故障。

前置知识

  • [C1-S1] 的 MOD 目录、mod_info.json 和 UTF-8 无 BOM 要求;
  • [C6-S4] 的构建与游戏加载;
  • [C7-S1] 的应用加载回调;
  • [C7-S2] 的 Global.getSettings() 和日志入口。

把说明文字放入资源文件

在 MOD 的 data/config/gear_in/notes.txt 写入以下文本。路径从 MOD 根目录起算,目录名中的 gear_in 用来标明这份资源的归属:

GearIn file loading is ready.

接着在 [C7-S1] 的 GearInModPlugin.onApplicationLoad(...) 追加读取与日志,保留既有代码。这个回调已声明 throws Exception,读取失败时由应用加载流程报告异常:

String notes = Global.getSettings().loadText("data/config/gear_in/notes.txt", "gear_in");
Global.getLogger(GearInModPlugin.class).info("GearIn notes: " + notes);

构建并重新启动游戏后,GearIn notes 日志应包含文件里的句子。这里取得的是字符串,使用方可以把它交给界面、解析成自己的格式,或像本例一样直接记录。

文字修改与代码修改有了各自的发布方式。 调整 notes.txt 后重新加载资源即可;调整读取时机或处理方法,才需要重新构建 JAR。同一份文件也可以供多个代码入口使用。后续的 JSON 和 CSV 会为内容增加结构,运行期产生的数据则由 common 的读写入口保存。

为读取选择来源

上面的调用有两个参数:资源相对路径与 MOD ID。下面的局部片段比较它与单参数形式:

String notes = Global.getSettings().loadText("data/config/gear_in/notes.txt");
String notesFromMod = Global.getSettings().loadText(
        "data/config/gear_in/notes.txt", "gear_in");

单参形式从当前资源空间选择一份文件。同一路径若由多个 MOD 提供,选中的来源会影响返回内容。双参形式把来源限定为指定 MOD;这里的 gear_in 对应 mod_info.json 的 id,并且该 MOD 已启用。

对这份自有说明,来源限定能够直接表达我们要读哪一个 MOD。向外开放的共享资源可以另行约定默认来源,但这个选择应当在调用处明确。

路径与返回文本

资源路径使用 / 分隔,例如 data/config/gear_in/notes.txt,起点是 MOD 根目录。引擎在读取前拒绝 ..、反斜杠、冒号和以 / 开头的路径;带盘符的绝对路径同样会被拒绝。

loadText 按 UTF-8 解码,移除 \r 后返回文本,BOM 则会留在首字符。资源文件保存为 UTF-8 无 BOM,后续解析才能从真正的内容开始。

读取成功也可能带回异常首字符

带 BOM 的文本可以被 loadText 读回;异常往往在后续解析或比较字符串时才出现。核对文件编码时,同时检查首字符。

文件找不到、路径非法或 MOD ID 找不到,会在读取调用点产生异常。本例让异常沿应用加载报告,日志中的 GearIn notes 则标明成功读回内容的用途。

验证方案

前置数据:gear_in MOD、notes.txt 和入口类读取片段已就绪。

  1. 保存资源与读取片段,构建 JAR 并重启,搜索 GearIn notes。
  2. 使用单参 loadText 读取 data/config/gear_in/notes.txt,观察返回文本。
  3. 将读取调用改为双参形式并传入 gear_in,再次启动并观察返回文本。

预期结果:

  • 两次读取都返回 GearIn file loading is ready.;
  • 双参调用只读取 gear_in 的资源;
  • 路径、来源和编码正确时,启动日志没有文本读取异常。

故障分析

  • 路径校验抛出异常:路径含 \\、..、盘符或首字符 /。

    • 解决方案:改用 MOD 根目录下以 / 分隔的相对路径,再调用 loadText。
  • 双参读取出现空对象异常:传入的 modId 与已启用 MOD 不一致。

    • 解决方案:核对 mod_info.json 的 id 和启用状态。
  • 返回文本的首字符异常:源文件带有 BOM。

    • 解决方案:以 UTF-8 无 BOM 重新保存。
  • 读取到另一份同名文件:资源路径过于通用,当前资源空间选择了其他来源。

    • 解决方案:使用带 MOD 前缀的目录或双参入口限定来源。

总结

loadText 把资源文件交给代码使用:相对路径定位文件,MOD ID 限定来源,返回的字符串再由调用方处理。文件里的内容可以独立于 JAR 调整;读取时机与使用方式仍属于代码职责。

建议参考项

  • com.fs.starfarer.api.SettingsAPI:loadText;路径安全校验由引擎在读取入口自动执行。
  • data/config/:MOD 自有文本资源可以使用的目录;
  • mod_info.json:MOD ID 来源。
在 GitHub 上编辑此页
上次更新: 2026/10/14 12:25
贡献者: 1847905557
下一页
读取 MOD 内 JSON 文件