【问题标题】:Analog for C#'s Settings in Java?Java中C#设置的模拟?
【发布时间】:2015-02-24 16:40:09
【问题描述】:

我已经知道 Java 的 java.util.Properties。这个类的唯一缺点是它似乎需要将设置存储在外部文件中。据我所知,C# 的 Settings 类将所有数据存储在实际的可执行文件中。 是否可以在执行的 jar 文件中存储可读写的数据?

【问题讨论】:

  • 有没有可能在执行的jar文件中存储可读写的数据?是的,有可能。但我强烈建议你不要这样做。 jar 文件是一种 zip 文件,修改 zip 文件中的数据很棘手(我认为您必须编写一个类加载器来重新加载它)。
  • java.util.prefs 是另一种选择——仍然不在 JAR 文件中,而是在某些系统管理的位置(在 Windows 中,这是注册表;在 Linux 上,我认为它在用户的主目录)。有一个内置的导出到 XML 工具,用于在系统之间移动设置。
  • @JeffreyBosboom 是对的。尽管java.util.prefs.Preferences 也可能在 Windows 下使用 XML 文件,这对于不允许更改注册表的受限 Windows 帐户可能很有用。一种常见的做法是在主文件夹中使用.myapp 文件夹:System.getProperty("user.home")
  • @ElliottFrisch 我知道我可以使用 WinRAR 打开 JAR 文件。是否可以在代码中将 JAR 文件视为 ZIP 文件,以便我能够将带有序列化设置/数据的文件附加到存档中?
  • 没有。您不能“附加”到 LZW 存档中的文件;他们不是这样工作的。基本上,您可以这样做,但您必须在 ZipEntry(在 Java API 中)中一次压缩整个文件,或者将文件添加到存档中。

标签: java jar settings


【解决方案1】:

没有用于执行此操作的 API。

是否可能找到特定类所在的 .jar 文件并对其进行修改?是的,有一些工作。但你不应该这样做,因为:

  • 直到下次启动 Java 虚拟机时才能看到更改。
  • 它会破坏安全性,例如签名的 jar。
  • 这使得每个用户的设置变得困难或不可能。
  • 它禁止将来使用 Web Start,因为运行时 .jar 文件是 Web URL 或缓存的临时文件。

应用程序设置不属于运行时二进制文件。毕竟,您不会尝试在 C 或 C++ 应用程序中这样做。

写入用户目录中某处的文件确实是保存应用程序设置的最佳方式。您不必使用 java.util.Properties;如果数据不是扁平结构,或者即使是,您可能需要使用XMLEncoderXMLDecoder

如果设置不重要(例如,窗口位置和大小),您可以使用 Preferences 类存储它们。

【讨论】:

  • 在我的特殊情况下,我将是唯一的用户,我只想拥有一个 JAR 文件。我仍然认为这个答案是正确的,因为它很好地解释了在可执行文件中存储用户数据的问题:)
猜你喜欢
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2015-04-01
  • 2015-11-25
  • 1970-01-01
  • 2023-03-13
  • 2010-09-17
相关资源
最近更新 更多