我知道 .jar 文件基本上是档案,也是应用程序。我要问的是如何存储打包在程序中的数据(实际文件而不仅仅是字符串)?我想在我的 Java 代码中执行此操作。
如果您想知道的话,原因是我正在制作游戏的服务器模组。服务器启动并创建所有关卡数据,我想将所有这些文件存储在我的 .jar 应用程序中。
是的,你可以做到这一点。
可以使用
Class.getResourceAsStream(String)
访问类路径上 JAR 文件中的非代码资源。应用程序通常会这样做,例如将国际化消息嵌入为资源包。
要将文件放入 JAR 文件中(在项目构建时!),只需在运行
jar
命令之前将其复制到输入目录树中的适当位置即可。 Maven、Gradle 等构建工具可以为您实现自动化。
有没有办法将文件添加到应用程序内的存档中?
理论上,您的应用程序可以将文件存储在自己的 JAR 文件中,在某些情况下:
程序是:
如果初始 JAR 被 JVM/OS 锁定,最后一步可能不起作用。在这种情况下,您需要在包装脚本中进行重命名。
但是,我认为大多数人都会同意这是一个坏主意。只编写常规文件更简单、更健壮。
其他答案提供了一些很好的策略,但我建议采取不同的方向。
这款游戏据说有图形,是一个桌面应用程序。从 Web 服务器分发桌面应用程序是最容易的。
如果您的游戏符合这两点,那么请考虑使用 Java Web Start 来部署它。
JWS 提供其他应用程序无法使用的 API。对于这个问题特别感兴趣的一个是 PersistenceService。 PersistenceService 允许应用程序存储和恢复少量数据。 (即使它位于沙箱中)。我做了一个小演示。 PersistenceService 的。
这个想法是检查 PersistenceService 中的应用程序数据,如果没有找到,则使用 Jars 中的数据。如果用户/应用程序更改了数据,请将更改后的数据写入 PersistenceService。
要创建 JAR,请使用
java.util.jar.JarFile 类。 stackoverflow 上还有另一个问题,它描述了如何创建/编写 JAR 文件。
/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());