1

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

我正在创建一个游戏,我希望它全部从可运行的 jar 文件中运行,所以我的所有资源(图像和文本文件)都将在 jar 文件中。

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

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

我只想知道基本正确的露水方法:

  1. 我需要能够加载图像(不知何故,我已经在工作了。我对它进行了一些修改并意外地做到了,所以我不知道它是如何工作的)
  2. 我需要能够从文本文件中读取(我也有这个工作,再次,偶然和数小时的猜测。)
  3. 我需要能够写入存在并且在 jar 中的文本文件。这就是让我觉得我做错了的原因。我想要做的就是能够保存某些设置,以便它们在下一次加载时工作,我不知道如何写入文件。

在eclipse(Indigo)中,我创建了一个文件夹名称“资源”并将其标记为源文件夹。我把我所有的图像和文本文件都放在那里。我读到这样的图像:

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");
}

正如您可能从我的代码中看出的那样,我迷路了。

4

2 回答 2

4

对于遇到这个问题的其他人。

除非您可以对正在使用的操作系统施加限制,否则您无法执行此操作,即使那样您也可能无法执行此操作。

以下是一些需要注意的限制:

  • Microsoft Windows 实现了自己的读写锁符号:当有一个读句柄打开时,您不能写入文件。JVM 将打开一个读取句柄,因为这是类路径上的文件,因此在 Java 中是不可能的(除非你想派生一个临时进程,杀死自己,让临时进程重写并重新启动......这会很难看并且防病毒软件可能会停止临时进程)

  • 大多数 unix OS 实现都没有问题,尽管 JVM 会在 JAR 文件中缓存偏移量,所以一旦你完成并尝试加载一个类,你的程序就会崩溃。

  • 只有 Windows 用户倾向于不使用文件权限来锁定对可执行文件的写入权限,因此假设您对 jar 具有写入权限是无效的。

第二点让所有操作系统实现都陷入困境(除非您可以使用叉子,并且叉子无论如何都会做出很多冒险的假设)

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

于 2013-01-20T09:40:58.057 回答
1

将设置写入 JAR 之外的知名位置怎么样?

作为保存设置的替代方法,请考虑以下方法之一:

于 2013-01-20T06:35:14.360 回答