我的Java程序如何在.jar文件中存储文件?

我知道.jar文件基本上都是存档和应用程序。 我问的是如何在程序中存储数据(实际文件不仅仅是字符串)? 我想在我的Java代码中执行此操作。

如果你想知道我正在制作一个游戏的服务器mod,原因就在于此。 服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。

是的,你可以做到这一点。

可以使用Class.getResourceAsStream(String)访问类路径上的JAR文件中的非代码资源。 应用程序例行执行此操作,例如,将国际化消息作为资源包嵌入。

要将文件放入JAR文件,只需将其复制到输入目录树中的适当位置,然后再运行jar命令。

跟进

理论上,在某些情况下,您的应用程序可以将文件存储在自己的JAR文件中:

  • JAR必须是本地文件系统中的文件; 即不是从远程服务器获取的JAR。
  • 应用程序必须具有对JAR文件及其父目录的写访问权。
  • 应用程序不必读回它在当前类加载器中写入JAR的文件; 即没有退出并重新启动。
  • JAR必须不需要签名。

程序将是:

  1. 找到JAR文件并作为ZIP存档阅读器打开。
  2. 创建ZIP存档编写器以编写新版本的JAR文件。
  3. 将应用程序的文件写入编写器。
  4. 将ZIP阅读器中的所有资源写入编写器,不包括旧版本的应用程序文件。
  5. 关闭读者和作家。
  6. 重命名新版本的JAR以替换旧版本。

如果初始JAR被JVM / OS锁定,则最后一步可能不起作用。 在这种情况下,您需要在包装器脚本中重命名。

但是,我认为大多数人会同意这是一个不好的想法。 只编写常规文件更简单,更健壮。

其他答案提供了一些很好的策略,但我建议采取一些不同的方向。

据说该游戏具有图形并且是桌面应用程序。 从Web服务器分发桌面应用程序非常容易。

如果这两件事都适用于您的游戏,那么请考虑使用Java Web Start来部署它。

JWS提供其他应用程序无法使用的API。 对此问题特别感兴趣的是PersistenceService。 PersistenceService允许应用程序存储和恢复少量数据。 (即使是在沙盒中)。 我做了一个小演示。 PersistenceService 。

我们的想法是检查PersistenceService的应用程序数据,如果没有找到,请使用Jars中的数据。 如果用户/应用程序更改数据,请将更改的数据写入PersistenceService。


JWS还提供其他不错的function,如启动画面,桌面集成,自动更新..

这不可能。 但是,您可以查看嵌入式数据库以查找用例。 Java 6附带JavaDB。 如果您不想使用它,那么您可以在这里找到更多信息http://java-source.net/open-source/database-engines

我建议您考虑使用两个JAR:一个用于存储应用程序的类文件,另一个用于存储用户数据。 如果您没有两个单独的JAR,那么从操作系统获取写锁定将会遇到困难(因为当您正在读取它时,您将尝试覆盖包含程序的JAR)。

要创建JAR,请使用java.util.jar.JarFile类 。 stackoverflow还有另一个问题,它描述了如何创建/编写JAR文件。

不要这样做。 jar文件是应用程序类和资源的源,而不是文件系统。 您不会尝试将文件保存到exe中,是吗?

通过在Source Packages中创建一个文件(例如: /src/resource/file.txt ),可以使用Class.getResourceAsStream(String)读取其内容。

这是以下答案的有效实现

  InputStream is = Class.class.getResourceAsStream("/resource/file.txt"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; while((line = br.readLine()) != null) { sb.append(line).append("\n"); } System.out.println(sb.toString());