代码之家  ›  专栏  ›  技术社区  ›  Drubio

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

  •  0
  • Drubio  · 技术社区  · 6 年前

    我有一个在Eclipse上开发的Java应用程序,我想生成一个可执行的JAR。首先我发现了一个问题,jar无法管理输入到 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 回复  |  直到 6 年前
        1
  •  1
  •   DrHopfen    6 年前

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

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

        2
  •  1
  •   Marco A. Hernandez    6 年前

    我认为更新jar(或zip)中文件的唯一方法是再次提取、修改和压缩它。也许你不能用一个跑罐来做这件事。

    当你做:

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

    您可能会得到一个filenotfoundexception,因为您不能使用文件api,就像您不能使用fileinputstream加载属性一样。

    最好的解决方案可能是将属性存储在jar之外的某个地方,或者使用java首选api。

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