项目可以在IDE中读取txt文件,但在导出项目后无法正常工作

问题描述

我刚刚完成了一个小游戏,现在我想导出它,以便可以将其用作普通应用程序,可以从桌面启动。它正在工作,但是当它尝试读取.txt文件(我想在其中保存一些重要内容)时,它不再起作用。但是在IDE中它可以正常工作。我用Eclipse和IntelliJ进行了测试,但是得到的结果相同。

programm structure

这就是我试图保存所有东西的方式。图片位于res文件夹中的文件夹中,该文件夹位于src文件夹中。这很好。我对saves文件夹中的文件尝试了同样的操作,该文件也位于src文件夹中,但是导出后它们无法正常工作。

BufferedReader read = new BufferedReader(new FileReader(getClass().getResource("/res/player/" + name + "/data.txt").getFile()));

这是我尝试读取文本文件代码

我在互联网上找不到任何视频或其他信息,如何解决此问题。

解决方法

您可以尝试将全长路径传递给BufferedReader。

突如其来:

String path = System.getProperty("java.class.path");

然后从那里建立您的位置。 如果不起作用,请在这里查看:

[https://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file][1]

然后尝试

BufferedReader bin = new BufferedReader(NewFileInputStream( [path] ) );

哦,而且,直接搜索api可能比搜索视频和教程更快。这些通常会运行半小时,最终,当您实际上只需要一行代码时,您就浪费了时间。

https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html
,

图片在res文件夹中,而src文件夹中。

这表明当您“导出”项目时,res文件夹的内容将捆绑到生成的Jar中。

这是一种通常称为“嵌入式资源”的方法,其中资源被“嵌入”到应用程序/ Jar中。

由于Jar只是一个zip文件,您将无法访问这些资源,就好像它们是磁盘上的文件一样,因为它们不是。

相反,您需要根据需要直接使用生成的URL或使用Class#getResourceAsStream

这意味着,而不是...

BufferedReader read = new BufferedReader(new FileReader(getClass().getResource("/res/player/" + name + "/data.txt").getFile()));

您应该使用类似...

BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/res/player/" + name + "/data.txt")));

我也希望您利用try-with-resources来管理您的资源

另外,请注意,这样嵌入资源使它们变为只读。