【问题标题】:Is there a way to write to a file that is inside a JAR? [duplicate]有没有办法写入 JAR 中的文件? [复制]
【发布时间】:2020-05-21 12:34:42
【问题描述】:

我目前正在使用 java 类 Preferences 来维护我们的 java 应用程序内部的偏好。它很简单,目前只包含 2 个键/值对。该项目的一些高层要求将preferences.xml 文件保留在JAR 中,以使其干净运行,因此所有内容都将包含在JAR 中(用户不需要能够访问此文件)。

我知道首选项有一个使用 InputStream 的导入和一个使用 OutputStream 的导出。无论如何使用 outputStream 编辑 jar 内的文件?

【问题讨论】:

  • 不可能,但请参阅stackoverflow.com/a/45998896/984823
  • 这能回答你的问题吗? Self exploding and rejaring jar file during execution(你可能更喜欢不被接受的答案,你可能应该遵循接受的答案)
  • 我建议在您的 jar 中放置一个默认配置文件,当您还没有配置文件时,您可以为用户安装该文件。仅使用 jar 运行应用程序仍然是可能的,它让每个用户都有自己的偏好,并且如果多个用户在多用户计算机上使用相同的 .jar,它仍然可以工作
  • 正确的方法——以及所有多平台应用程序都在这样做——是将默认值存储在 .jar 文件中,并使用文件系统中的某个已知位置,位于用户的主目录,用于存储任何更改。如果该文件不存在,您应该通过复制存储在 .jar 中的默认值来创建它。 (请注意,Preferences 类在 Windows 中不使用preferences.xml 文件,除非您export 首选项。)

标签: java eclipse jar preferences fileoutputstream


【解决方案1】:

JAR 文件是一个 zip 文件夹,因此可以使用 java.util.zip 包对其进行提取和处理。

但是,正在运行的 jar 可能会受到写保护,从而防止内容修改。

更适合将配置存储在操作系统的相应位置。在 windows 上,常见的位置是 windows 注册表。

有一个用于编辑注册表的 Java 库,如 this answer 所示。

库来源:https://github.com/apache/npanday/tree/trunk/components/dotnet-registry/src/main/java/npanday/registry

要将配置存储在其他操作系统上,您可以使用以您的应用程序命名的文件夹中的文件。

  • Linux 上的常用位置:“~/.config”文件夹
  • Mac 上的常用位置:“~/Library/Application Support”文件夹。

【讨论】:

  • 实际上,存储此类信息的更好位置是 %AppData% 下的文件。或者在 Linux 中为 ~/.config,在 OS X 中为 ~/Library/Application Support
  • 感谢@VGR 更新了反映的答案。
【解决方案2】:

我认为不可能使用 OutputStream 编辑 jar 内的文件。

您可以这样做: 您可以导入文件,对其进行编辑并将其添加回 jar 文件。 要将文件推送到 jar 中,请参阅 adding a file to jar

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多