【问题标题】:getClass().getResource() not working for .txt files?getClass().getResource() 不适用于 .txt 文件?
【发布时间】: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


【解决方案1】:

为此,我将变量写入 jar 中的 txt 文件

出于这个原因修改 jar 是不正确的。您需要使用其他东西来存储用户偏好、保存的游戏数据、分数等。

一种方法是使用 Preferences API。请参阅What is the best way to save user settings in java application? 了解更多信息。

【讨论】:

  • 谢谢,我会研究一下偏好 API 并使用它——它似乎很适合我的目的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2018-10-19
  • 2013-01-13
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多