Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的Java程序如何在其.jar文件中存储文件?_Java_Jar_Archive - Fatal编程技术网

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

我的Java程序如何在其.jar文件中存储文件?,java,jar,archive,Java,Jar,Archive,我知道.jar文件基本上是归档文件,也是应用程序。我想问的是,如何在程序中存储打包的数据(实际文件而不仅仅是字符串)?我想在Java代码中实现这一点 如果你想知道的话,原因是我正在制作一个游戏的服务器模型。服务器启动并创建所有级别数据,我想将所有这些文件存储在我的.jar应用程序中。这是不可能的。但是,您可以为您的用例查看嵌入式数据库。Java6随JavaDB一起提供。如果您不想使用它,您可以在此处找到更多信息是的,您可以这样做 可以使用Class.getResourceAsStream(Str

我知道.jar文件基本上是归档文件,也是应用程序。我想问的是,如何在程序中存储打包的数据(实际文件而不仅仅是字符串)?我想在Java代码中实现这一点


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

这是不可能的。但是,您可以为您的用例查看嵌入式数据库。Java6随JavaDB一起提供。如果您不想使用它,您可以在此处找到更多信息

是的,您可以这样做

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

要将文件放入JAR文件,只需在运行
JAR
命令之前将其复制到输入目录树中的适当位置

跟进

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

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

  • 找到JAR文件并作为ZIP归档读取器打开
  • 创建一个ZIP存档编写器来编写JAR文件的新版本
  • 将应用程序的文件写入编写器
  • 将所有资源从ZIP读取器写入写入器,不包括应用程序文件的旧版本
  • 关闭读写器
  • 重命名JAR的新版本以替换旧版本
  • 如果初始JAR被JVM/OS锁定,那么最后一步可能不起作用。在这种情况下,您需要在包装器脚本中进行重命名


    然而,我想大多数人都会同意这是一个坏主意。编写普通文件更简单,更健壮。

    < 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());