You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX打包Jar后加载文本文件至Scanner失败问题求助

解决LibGDX打包Jar后无法读取内部文本文件的问题

这个问题的核心原因是:当你把项目打包成Jar文件后,LibGDX的内部资源(比如你的gamearea.txt)是嵌入在Jar包内部的,不再是文件系统中的独立文件。而你原来的代码用了Gdx.files.internal(...).file()来获取File对象,这个方法在Jar环境下会失效——因为File类只能访问文件系统中的真实文件,无法访问Jar包内的嵌入资源。

解决方案:使用LibGDX的FileHandle直接读取输入流

LibGDX的FileHandle提供了多种读取内部资源的方式,不需要依赖File对象。下面是修改后的代码,替换你原来的文件读取逻辑:

// 直接获取FileHandle,不要调用file()方法
FileHandle arenaFile = Gdx.files.internal("HraciaPlocha/gamearea.txt");

// 使用try-with-resources确保资源自动关闭,避免内存泄漏
try (Scanner sc = new Scanner(arenaFile.read())) {
    this.width = sc.nextInt() + 1;
    this.height = sc.nextInt() + 1;
    sc.nextLine();
    this.arena = new Block[width][height];
    
    for (int rows = 0; rows < this.arena.length - 1; rows++) {
        for (int columns = 0; columns < this.arena[rows].length - 1; columns++) {
            switch (sc.nextInt()) {
                case 1:
                    this.arena[rows][columns] = new Bariera(lavaXSur + 32 * columns, hornaYSur + 32 * rows);
                    break;
                case 2:
                    // 注意:原代码里的`riadky`应该是`rows`?可能是笔误,这里修正了
                    this.arena[rows][columns] = new KlasickaBodka(lavaXSur + 32 * columns, hornaYSur + 32 * rows);
                    this.pridajBodku();
                    break;
                case 3:
                    this.arena[rows][columns] = new Zmurzuvac(lavaXSur + 32 * columns, hornaYSur + 32 * rows);
                    break;
                default:
                    this.arena[rows][columns] = null;
                    break;
            }
        }
    }
} catch (IOException e) {
    // 打印错误日志,方便调试定位问题
    Gdx.app.error("GameArea", "Failed to load gamearea.txt", e);
}

this.spustena = true;

为什么原来的方法在IDE里能运行?

在NetBeans等IDE中运行时,你的资源文件存放在项目的assets目录下(属于文件系统中的真实路径),所以Gdx.files.internal(...).file()能拿到有效的File对象。但打包成Jar后,所有资源都被压缩到Jar包内部,不再是独立文件,因此File类无法访问。

额外注意事项

  • 确保你的HraciaPlocha文件夹确实在LibGDX项目的assets目录下,打包工具会自动包含该目录下的所有资源。
  • 如果习惯用BufferedReader读取,也可以用arenaFile.reader()方法直接获取BufferedReader,示例:
    try (BufferedReader br = arenaFile.reader()) {
        // 自定义读取逻辑
    }
    

内容的提问来源于stack exchange,提问作者rufo123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:29:04