在可运行的jar中加载和保存资源?

可能重复:
Java程序如何使用.jar中的文件进行读写?

我正在创建一个游戏,我希望所有这些都在runnable jar文件上运行,所以我的所有资源(图像和文本文件)都将在jar文件中。

我遇到的问题是,处理jar中的文件非常困难。

我正在使用eclipse,它有时会对你起作用,因为如果你从eclipse运行它会找到文件,但如果你导出它就不会。

我只是想知道揭露一些事情的正确方法:

  1. 我需要能够加载图像(我已经工作了,不知何故。我有点修补它并且意外地做了,所以我不知道它是如何工作的)
  2. 我需要能够从文本文件中读取(我也有这个工作,再次,偶然和猜测几个小时。)
  3. 我需要能够写入存在且存在于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具有写访问权限是无效的。

第二点让你在所有操作系统中都死了(除非你能用叉子,而且叉子做了很多冒险的假设)

只需写入单独的文件即可完成。