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
相关产品推荐
相关产品推荐

