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

时间:2013-01-20 06:07:58

标签: java eclipse resources inputstream outputstream

  

可能重复:
  How can a Java program use files inside the .jar for read and write?

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

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

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

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

  1. 我需要能够加载图像(我已经工作了,不知何故。我有点修补它并且意外地做了,所以我不知道它是如何工作的)
  2. 我需要能够从文本文件中读取(我也有这个工作,再次,偶然和猜测时间。)
  3. 我需要能够写入存在且存在于jar中的文本文件。这就是让我觉得我做错了。我想要做的就是能够保存某些设置,以便它们在下次加载时工作,而且我不知道如何写入文件。
  4. 在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");
    }
    

    你可以从我的代码中看出,我迷路了。

2 个答案:

答案 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中讨论过。