可能重复:
How can a Java program use files inside the .jar for read and write?
我正在创建一个游戏,我希望所有这些都可以在runnable jar文件上运行,所以我的所有资源(图像和文本文件)都将放在jar文件中。
我遇到的问题是,处理jar中的文件非常困难。
我正在使用eclipse,它有时会对你起作用,因为如果你从eclipse运行它会找到文件,但如果你导出它就不会。
我只想知道揭露一些事情的正确方法:
在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");
}
你可以从我的代码中看出,我迷路了。
答案 0 :(得分:4)
对于遇到此问题的其他人。
除非您可以对正在使用的操作系统设置约束,否则您无法执行此操作,即使这样您也可能无法执行此操作。
以下是一些需要注意的限制因素:
Microsoft Windows实现了自己的读写锁定语法:当读取句柄打开时,您无法写入文件。 JVM将打开一个读句柄,因为这是类路径上的文件,因此在Java中是不可能的(除非你想分叉一个临时进程,自杀,让临时进程重写并重新启动......这将是丑陋的并且反病毒很可能会阻止临时过程)
大多数unix OS实现都没有问题,尽管JVM会在JAR文件中缓存偏移量,因此一旦完成并尝试加载类,程序就会崩溃。
< / LI>只有Windows用户不会使用文件权限来锁定对可执行文件的写访问权限,因此假设您对jar有写访问权限是无效的。
第二点让你在所有操作系统中都死了(除非你能用叉子生活,并且叉子无论如何都会做出很多冒险的假设)
只需写入单独的文件即可完成。
答案 1 :(得分:1)
如何将设置写入JAR之外的知名位置?
作为保存设置的替代方案,请考虑以下方法之一:
java.util.prefs.Preferences
,提及here。
JWS PersistenceService
,描述了here。
Cookie,在Accessing Cookies中讨论过。