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

问题描述 投票:0回答:6

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

如果您想知道的话,原因是我正在制作游戏的服务器模组。服务器启动并创建所有关卡数据,我想将所有这些文件存储在我的 .jar 应用程序中。

java jar archive
6个回答
20
投票

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

可以使用

Class.getResourceAsStream(String)
访问类路径上 JAR 文件中的非代码资源。应用程序通常会这样做,例如将国际化消息嵌入为资源包。

要将文件放入 JAR 文件中(在项目构建时!),只需在运行

jar
命令之前将其复制到输入目录树中的适当位置即可。 Maven、Gradle 等构建工具可以为您实现自动化。


有没有办法将文件添加到应用程序内的存档中?

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

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

程序是:

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

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

但是,我认为大多数人都会同意这是一个坏主意。只编写常规文件更简单、更健壮。


4
投票

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

这款游戏据说有图形,是一个桌面应用程序。从 Web 服务器分发桌面应用程序是最容易的。

如果您的游戏符合这两点,那么请考虑使用 Java Web Start 来部署它。

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

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


JWS 还提供其他不错的功能,如启动屏幕、桌面集成、自动更新..


1
投票
这是不可能的。但是,您可以根据您的用例查看嵌入式数据库。 Java 6 附带 JavaDB。如果您不想使用它,可以在这里找到更多信息

http://java-source.net/open-source/database-engines


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

要创建 JAR,请使用

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


1
投票


1
投票
/src/resource/file.txt

),可以使用

Class.getResourceAsStream(String)
 读取其内容

这是以下

answer

的有效实施 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());

© www.soinside.com 2019 - 2024. All rights reserved.