【问题标题】:Can you store data inside a .jar?您可以将数据存储在 .jar 中吗?
【发布时间】:2013-05-18 06:20:26
【问题描述】:

我正在学习 java,目前正在尝试开发一个简单的应用程序。我的问题是您可以将有关设置等的数据存储在 .jar 内部的文本文件中吗?如果是这样,您将如何在 java 中访问它?对不起,如果这是一个非常愚蠢的想法。

【问题讨论】:

  • 是的,但你不能写信(很容易)
  • here 中查找getResourceAsStream(String) 方法。您可以从 jar 中的任何资源中检索 InputStream
  • 另外,一个 jar 包含(或应该包含)一个部署就绪的应用程序,插入任何东西是没有意义的。仅供参考,jar 只是 zip 文件的一个花哨的 java 名称。你可以用任何解压工具打开它,看看里面有什么。
  • @MadProgrammer 为什么我们不能写数据?
  • @Aman 有很多原因 - 它是 ZIP 文件,ZIP 文件实际上无法更新,而是将现有 ZIP 文件的内容复制到临时文件,写入新内容到它,删除旧的 ZIP 文件并将临时 ZIP 文件重命名到它的位置。首先,要知道你正在访问哪个 JAR 文件(或者它在哪里)并不容易,其次,操作系统可能会锁定 JAR(通过类加载器),这可能会阻止它被删除

标签: java testing internal


【解决方案1】:
InputStream is = this.getClass().getResourceAsStream("/data/file.txt");

您获得的资源需要在类路径中

【讨论】:

    【解决方案2】:

    是的,你可以,这不是一个愚蠢的问题,我们都需要从某个地方开始。

    您的问题分为两部分:

    1. 将数据/文本文件添加到 .jar -(使用 ant 将其 jar :)将“fileset dir=...”添加到 jar 目标,其中设置了 dir等于具有数据/文本文件的目录。参考How can I include data text files in a jar using Ant?

    2. 从 java 代码中访问该数据/文本文件 - 您需要使用 ClassLoader 和 getResourceAsStream。参考Loading files in JAR in Tomcat using getResourceAsStream

    另外,请查看https://github.com/gitjonathan/turbo-sansa,我有一个工作版本。

    【讨论】:

      【解决方案3】:

      您可以将数据存储在 .jar 中吗?

      只读数据可以存储在 JAR 文件中。如果 JAR 在类路径上,您可以使用 getResourceAsStream(...) 读取此类数据,如果 JAR 不在类路径上,则可以使用标准 JAR 文件 API 类。

      但是在 JAR 文件中存储可更新的数据是有问题的:

      • 在很多情况下这是不可能的;例如因为 JAR 文件是只读的或者是动态下载的。

      • 在所有其他情况下会很尴尬,因为标准 JAR 文件 API 类不支持就地更新。 (您需要创建一个新的 ZIP 文件,将旧内容与要更新的文件分开复制,添加该文件,然后重命名生成的文件。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-18
        • 2010-12-02
        • 2021-08-19
        • 2011-08-14
        • 1970-01-01
        • 2023-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多