【发布时间】:2013-11-30 12:36:36
【问题描述】:
背景:我正在编写游戏(作为可执行 jar),我的游戏的一部分是一个偏好对话框,您可以在其中设置对手名称和影响游戏进程的不同变量等内容。我认为最好在退出时保存这些内容,这样下次加载应用程序时它会记住您之前设置的内容。
为此,我将变量写入 jar 中的 txt 文件,然后在您开始新游戏时从中读取。这一切都可以通过 eclipse 正常工作,但是当我导出到 jar 时它根本不起作用。这是我用来读取文件的代码。它在一个名为“Util”的类中,并在其他地方被调用,但我尝试在需要的地方创建非静态方法并使用 getClass() 而不是 Util.class,但我仍然没有运气:
public static List<String> getListFromFile()
{
URI fileUri = null;
try
{
fileUri = Util.class.getResource("/gameplayPreferences.txt").toURI();
LoggingDialog.append("\nFileUri is " + fileUri, true);
}
catch (URISyntaxException e)
{
e.printStackTrace();
LoggingDialog.append(e.toString(), true);
}
Path gameplayPreferencesPath = Paths.get(fileUri);
LoggingDialog.append("\ngameplayPreferencesPath is " + gameplayPreferencesPath, true);
Charset charset = Charset.forName("US-ASCII");
try
{
List<String> list = Files.readAllLines(gameplayPreferencesPath, charset);
return list;
}
catch (IOException x)
{
x.printStackTrace();
LoggingDialog.append(x.toString(), true);
}
return null;
}
LoggingDialog 是我用来帮助我找出问题所在的地方。在这种情况下,我看到“FileUri is rsrc:gameplayPreferences.txt”,没有更多信息,所以我假设当我尝试将其转换为路径时,我得到了 NPE 或类似的东西。
文件gameplayPreferences.txt 位于一个名为“resources”的单独资源文件夹中,它位于我的构建路径的顶部。我不明白的是我这里也有图像文件,当我使用 getClass().getResource() 创建图像图标时,这工作正常 - 我可以导出到 jar 并且所有图像都正确显示。那么,为什么当我导出到 jar 时,使用相同的方法会破坏 txt 文件,我该如何解决?
【问题讨论】:
-
因为您无法写入 Jar 中的文件。 Eclipse 运行“爆炸”的 Jar,即在打包之前。您需要在文件系统的某处写入实际的
File。 -
如果有异常,您肯定会在日志中看到吗?您的
resources文件夹是否被复制到输出目录的根目录中?我注意到您没有在资源名称中包含resources... -
我的 LoggingDialog 并不是特别复杂,它只显示我明确告诉它显示的内容。如果代码以任何“catch”语句结束,我会看到一些东西,但它不会显示其他异常。
-
另见this Q&A。
标签: java file-io executable-jar