在运行时更新资源文件

时间:2017-07-03 15:54:59

标签: java maven properties resources

当我的应用程序启动时,它使用以下代码读取配置属性文件:

        Properties properties = new Properties();

        // parse the config resource

        try (InputStream input = getClass().getClassLoader().getResourceAsStream(filename))
        {
            if (input == null)
            {
                // throw exception
            }

            // read the property list (key-value pairs) from the input byte stream
            properties.load(input);
        }

我能够阅读和设置各个属性。

属性文件位于src/main/resources中,在使用maven构建应用程序后,它的副本放在target/classes中。当我打开它时,创建的jar文件在根目录中也有它的副本。

我还希望能够覆盖属性文件,以便下次启动应用程序时,它将读取新的更新文件。我该如何实现这一目标?它甚至可能吗?

我发现了this问题,但没有答案。

我试过这个:

        try (OutputStream output = new FileOutputStream(filename))
        {
            properties.store(output, null);
        }

如果我只是想创建一个新文件,它可以工作。然后我必须修改应用程序,使其从给定的文件夹读取而不是源自resources文件夹。这是我应该做的吗?

我对Java很新,所以请放轻松。

2 个答案:

答案 0 :(得分:1)

在jar文件中存储初始,默认属性,因为资源很好。

但是如果你想让它们可写,那么你需要将它们真正存储在磁盘上的某个文件中。通常,在用户主目录内的public static void main(String[] args) { if (args == null) { // complain about this unexpected input (return or throw NPE, IAE???) throw new IllegalArgumentException(); // in this case IAE. } else if (args.length <= 0) { // complain no argument was provided? return; } else if (args[0] == null) { // complain about this unexpected input (return or throw NPE, IAE???) throw new NullPointerException(); // in this case NPE. } ... 目录(或.yourapp文件)下。

因此,尝试查找文件,如果不存在,则回退到资源。写作时,请始终写入文件。

答案 1 :(得分:0)

这是您可以用于此的示例代码。在项目根目录中创建一个config文件夹,在其中放置app.properties文件

package com.yourparckage;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Config {

    /* Create basic object */
    private ClassLoader objClassLoader = null;
    private Properties commonProperties = new Properties();
    public static final String CONFIG_FILE = "config/app.properties";

    /**
     * This method loads config data from properties file
     * 
     */
    public Config() {
        objClassLoader = getClass().getClassLoader();
    }

    public String readKey(String propertiesFilename, String key) 
    {
        /* Simple validation */
        if (propertiesFilename != null && !propertiesFilename.trim().isEmpty() && key != null
                && !key.trim().isEmpty()) {
            /* Create an object of FileInputStream */
            InputStream objFileInputStream = null;

            /**
             * Following try-catch is used to support upto 1.6. Use try-with-resource in JDK
             * 1.7 or above
             */
            try {
                /* Read file from resources folder */
                objFileInputStream = new FileInputStream(propertiesFilename);
                /* Load file into commonProperties */
                commonProperties.load(objFileInputStream);
                /* Get the value of key */
                return String.valueOf(commonProperties.get(key));
            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                /* Close the resource */
                if (objFileInputStream != null) {
                    try {
                        objFileInputStream.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
        return null;
    }

}