在可运行的jar中加载和保存资源?
可能重复:
Java程序如何使用.jar中的文件进行读写?
我正在创建一个游戏,我希望所有这些都在runnable jar文件上运行,所以我的所有资源(图像和文本文件)都将在jar文件中。
我遇到的问题是,处理jar中的文件非常困难。
我正在使用eclipse,它有时会对你起作用,因为如果你从eclipse运行它会找到文件,但如果你导出它就不会。
我只是想知道揭露一些事情的正确方法:
- 我需要能够加载图像(我已经工作了,不知何故。我有点修补它并且意外地做了,所以我不知道它是如何工作的)
- 我需要能够从文本文件中读取(我也有这个工作,再次,偶然和猜测几个小时。)
- 我需要能够写入存在且存在于jar中的文本文件。 这就是让我觉得我做错了。 我想要做的就是能够保存某些设置,以便它们在下次加载时工作,而且我不知道如何写入文件。
在eclipse(Indigo)中,我创建了一个名为“resources”的文件夹,并将其标记为源文件夹。 我把所有的图像和文本文件放在那里。 我读了这样的图像:
public static Image ammo = new ImageIcon(TankMazeGame.class.getResource("ammo.png")).getImage();
我读了这样的文本文件:
InputStream is = TankMazeRunner.class.getClassLoader().getResourceAsStream("Settings.txt"); Scanner settingsReader = new Scanner(new InputStreamReader(is));
我正在写这样的设置文件,但它并没有真正起作用,所以这就是我需要帮助的地方。
File settingsFile = new File(DisplayMenu.class.getClassLoader().getResource("Settings.txt").getFile()); try { OutputStream os = new FileOutputStream(settingsFile, true); PrintWriter pw = new PrintWriter(os, true); pw.write("SIZE: " + TankMazeRunner.WIDTH + "\n"); os.flush(); pw.close(); } catch (Exception e2) { System.out.println("Error"); }
你可以从我的代码中看出,我迷路了。
如何将设置写入JAR之外的知名位置?
作为保存设置的替代方案,请考虑以下方法之一:
-
java.util.prefs.Preferences
,在这里提到。 -
JWS
PersistenceService
, 在此处描述。 -
Cookie,在访问Cookie中讨论。
对于遇到这个问题的其他人。
除非您可以对正在使用的操作系统设置约束,否则您无法执行此操作,即使这样您也可能无法执行此操作。
以下是一些需要注意的限制:
-
Microsoft Windows实现了自己的读写锁定语法:当读取句柄打开时,您无法写入文件。 JVM将打开一个读取句柄,因为这是类路径上的文件,因此在Java中是不可能的(除非你想分叉一个临时进程,自杀,让临时进程重写并重新启动……这将是丑陋的并且反病毒很可能会阻止临时过程)
-
大多数unix OS实现都没有问题,尽管JVM会在JAR文件中缓存偏移量,因此一旦完成并尝试加载类,程序就会崩溃。
-
只有Windows用户倾向于不使用文件权限来锁定对可执行文件的写访问权限,因此假设您对jar具有写访问权限是无效的。
第二点让你在所有操作系统中都死了(除非你能用叉子,而且叉子做了很多冒险的假设)
只需写入单独的文件即可完成。