4

我正在尝试使用 Java 类属性在执行之间保存我的应用程序的设置。之后,我想将我的应用程序导出到可运行的 JAR 文件中,并将所需的所有内容保存在这个文件中以提供可移植性。所以我的应用程序必须找到属性文件,加载它,然后在退出时将新设置保存到其中。

加载工作正常:

Properties prop = new Properties().load(this.getClass().getResourceAsStream("properties.cfg"));

但是为了存储,我需要找到相同的文件并覆盖它。方法 Properties.store() 需要一个 OutputStream 但 getResourceAsStream 返回一个 InputStream 因此我找不到文件并访问它。

它应该始终位于 *.class 文件中。我发现许多解决方案在导出到 JAR 之前有效,但在导出后没有一个有效。感谢您的任何建议。

4

3 回答 3

8

你不能重写你的jar(或者更确切地说,它很复杂而且不是一个好主意)。

一个更好的解决方案是从以下位置读取属性:

  1. 你机器上的一个目录
  2. .jar文件_

最初位置 1 没有属性文件,您将退回到您的.jar文件。当您编写属性时,您会将它们写入指定的目录,然后在下一次读取时,您将从该位置读取您的属性。这将在重新启动等后继续存在。

请注意,诸如Apache Commons Configuration之类的库会自动支持这种分层属性定位机制,并且可能会在编写自己的解决方案时为您节省一些时间/烦恼。

于 2012-07-30T08:11:33.000 回答
0

对于这种情况,最好的方法是将属性文件添加到类路径并使用 ResourceBundle 之类的东西加载它。

private static ResourceBundle _properties = ResourceBundle.getBundle("sample.properties");
String sampleProperty = _properties.getString(propertyKey);

如何执行:

假设你的 jar 文件是 MyJar.jar 并且属性文件被称为 sample.properties 那么你应该在它周围写一个批处理或 sh 文件

例如:run.sh

java -cp MyJar.jar:conf "Class with main Method"
于 2012-07-30T08:18:53.120 回答
0

拿spring的IO基础设施(ClasspathResource)

try {
        ClassPathResource r = new ClassPathResource("bdd.properties");
        Properties properties = new Properties();
        properties.load(r.getInputStream());
    } catch (IOException e) {
        Throwables.propagate(e);
    }

这是真正的简化。

于 2012-07-30T08:23:02.367 回答