如何在jar上重新加载属性文件

时间:2018-06-25 07:59:49

标签: java jar fileinputstream

我有一个在Eclipse上开发的Java应用程序,我想生成一个可执行的jar。首先,我发现了jar无法管理输入到FileInputStream的路由的问题,因此我决定将FileInputStream更改为getClass().getResourceAsStream()。问题是我必须在执行时覆盖属性文件,但是getResourceStream()不能正确地重新加载,因为它必须在高速缓存或其他内容中包含它。我尝试了在该论坛中找到的几种解决方案,但似乎都没有用。

我使用FileInputStream加载属性的原始代码是:

private Properties propertiesLoaded;
private InputStream input;
this.propertiesLoaded = new Properties();
this.input = new FileInputStream("src/resources/config.properties");
propertiesLoaded.load(this.input);
this.input.close();

这似乎在Eclipse上可以完美运行,但在jar上却不能。我尝试了通过该论坛提供的信息使用这种方法:

this.propertiesLoaded = new Properties();
this.input = this.getClass().getResourceAsStream("/resources/config.properties");
propertiesLoaded.load(this.input);
this.input.close();

问题在于,当程序尝试更新属性文件时,似乎无法正确地重新加载它。我可以看到该属性已被编辑,但是当再次读取时,它将返回旧值。覆盖该属性的代码是:

private void saveSourceDirectory(String str) {
    try {
        this.input = this.getClass().getResourceAsStream("/resources/config.properties");
        propertiesLoaded.load(this.input);
        propertiesLoaded.setProperty("sourceDirectory", str);
        propertiesLoaded.store(new FileOutputStream("src/resources/config.properties"), null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我的问题是:

  • 哪种方法可以更新可执行jar中的属性文件?
  • 如何强制我的程序重新加载属性文件中的内容?

2 个答案:

答案 0 :(得分:1)

我认为更新jar(或zip)中文件的唯一方法是再次提取,修改和压缩它。可能您在运行的jar上无法做到这一点。

当您这样做时:

propertiesLoaded.store (new FileOutputStream ("src / resources / config.properties"), null);

您可能会收到FileNotFoundException,因为无法使用File API,就像无法使用FileInputStream加载属性一样。

最好的解决方案可能是将属性存储在jar外部或使用Java Preferenced API。

相关:https://coderanch.com/t/616489/java/modify-Properties-file-JAR

答案 1 :(得分:1)

第一个问题:您不应该这样做。一种常见的方法是在可执行jar中使用内置配置,并可以选择将配置文件作为参数传递。将配置的更改存储回jar中并不是一个好主意,因为这意味着修改正在运行的二进制文件。

第二个问题:实现这种功能的常用方法是向配置文件添加一个更改侦听器。可以使用java.nio.file package完成: https://docs.oracle.com/javase/tutorial/essential/io/notification.html