我的Java程序如何在其.jar文件中存储文件?
我知道.jar文件基本上是归档文件,也是应用程序。我想问的是,如何在程序中存储打包的数据(实际文件而不仅仅是字符串)?我想在Java代码中实现这一点我的Java程序如何在其.jar文件中存储文件?,java,jar,archive,Java,Jar,Archive,我知道.jar文件基本上是归档文件,也是应用程序。我想问的是,如何在程序中存储打包的数据(实际文件而不仅仅是字符串)?我想在Java代码中实现这一点 如果你想知道的话,原因是我正在制作一个游戏的服务器模型。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。这是不可能的。但是,您可以为您的用例查看嵌入式数据库。Java6随JavaDB一起提供。如果您不想使用它,您可以在此处找到更多信息是的,您可以这样做 可以使用Class.getResourceAsStream(Str
如果你想知道的话,原因是我正在制作一个游戏的服务器模型。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。这是不可能的。但是,您可以为您的用例查看嵌入式数据库。Java6随JavaDB一起提供。如果您不想使用它,您可以在此处找到更多信息是的,您可以这样做 可以使用
Class.getResourceAsStream(String)
访问类路径上JAR文件中的非代码资源。应用程序通常这样做,例如,将国际化消息作为资源包嵌入
要将文件放入JAR文件,只需在运行JAR
命令之前将其复制到输入目录树中的适当位置
跟进
理论上,在某些情况下,应用程序可以将文件存储在自己的JAR文件中:
- JAR必须是本地文件系统中的文件;i、 不是从远程服务器获取的JAR
- 应用程序必须具有对JAR文件及其父目录的写访问权限
- 应用程序不需要在当前类加载器中读回它写入JAR的文件;i、 e.无需退出和重新启动
- JAR不需要签名
然而,我想大多数人都会同意这是一个坏主意。编写普通文件更简单,更健壮。 < P>我建议您考虑使用两个jar:一个用来存储应用程序的类文件,另一个用来存储用户数据。如果您没有两个独立的JAR,那么您将很难从操作系统获得写锁(因为您将试图在java读取程序时覆盖包含程序的JAR)
要创建JAR,请使用。还有一个例子描述了如何创建/编写JAR文件。其他答案提供了一些好的策略,但我建议朝着不同的方向去做 这个游戏应该有图形,是一个桌面应用程序。从web服务器分发桌面应用程序最容易 如果这两种情况都适用于您的游戏,那么请研究如何使用来部署它 JWS提供了其他应用程序无法使用的API对这个问题特别感兴趣的是PersistenceService。PersistenceService允许应用程序存储和恢复少量数据。(即使在砂箱中)。我已经做了一个小计划 其想法是检查PersistenceService中的应用程序数据,如果找不到,则使用JAR中的数据。如果用户/应用程序更改了数据,请将更改后的数据写入PersistenceService
JWS还提供了其他不错的功能,如启动屏幕、桌面集成、自动更新等。不要这样做。jar文件是应用程序类和资源的源,而不是文件系统。您不会试图将文件保存到exe中,是吗?通过在源程序包中创建文件(例如:
/src/resource/file.txt
),可以使用Class.getResourceAsStream(String)
这是以下内容的工作实现
如果你可以通过存档程序(如7zip或WinRAR)添加文件,那么为什么不能在应用程序中执行此操作?因为你需要能够写入文件系统,而在容器中运行时,默认情况下,安全策略禁止写入文件系统。是否有方法将文件添加到应用程序中的存档?可以访问这些文件通过这个API,但是您能用这个方法将更改写回JAR吗?建议的方法只用于从类路径访问资源,而不用于writing@Liam-如果外部.jar服务器正在创建您的程序jar,这是有意义的。如果您的程序本身正在尝试添加由服务器创建的文件,这是一个坏主意。我的回答涵盖了这两种情况。+1指出了如何回答问题,同时指出了不应该这样做。这种JWS是否应该像在网页中嵌入flash文件一样?在1.6.0_10+JRE中,小程序可以嵌入网页并使用JWS服务。根据Java1.2+,JWS可以在桌面上自由浮动地启动框架或小程序。我已经涉猎了前者(并可以给你一些例子),但主要使用了后者(我前面链接的JNLPAPI示例页面只是其中的一个小示例)。即使开发一个小程序,我也建议使用自由浮动选项——至少在一开始是这样。这对我来说不起作用
Class.Class.getResourceAsStream(“/resource/file.txt”)
正在返回null.Windows的独立可执行文件和macOS。应用程序包与您不一致。想要一个包含所有应用程序的内聚自包含包是非常明智的。@Alexander他们怎么不同意?从应用程序的角度来看,Windows独立可执行文件是只读的。啊,有趣,没关系。不过,我的观点对.app
捆绑包有效,这些捆绑包只包含以下内容
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());