【问题标题】:Read from property file after restarting program重新启动程序后从属性文件中读取
【发布时间】:2014-10-09 12:02:12
【问题描述】:

我正在尝试将我的配置数据保存在 config.properties 文件中。我正在像这样保存我的属性:

public static void setProperty(Parameter property) {

    // set the property's value
    prop.setProperty(property.getIndex(), property.getValue());

    // save properties to project root folder
    try {
        prop.store(output, null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

并像这样加载它们:

public static String getProperty(String componentName) {

    // get the property value
    return prop.getProperty(componentName);
}

一切正常,但是当我重新启动程序时,我没有任何属性了。我在程序开始时调用以下方法来加载我的属性文件:

static String FILE = "config.properties";
static InputStream input;
static OutputStream output;
static Properties prop = new Properties();

public static void loadExistingProperties() {
    try {
        input = new FileInputStream(FILE);
        output = new FileOutputStream(FILE);

        // load properties from file
        prop.load(input);
        System.out.println("amount of saved properties: " + prop.size());

    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (input != null) {
            try {
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

谁能告诉我为什么我在重新启动程序后找不到我的属性?我试图让我的prop 出错的方式可能是错误的吗?我不知道如何以另一种方式做到这一点。

【问题讨论】:

  • 您是否随时关闭输出流?

标签: java properties inputstream outputstream restart


【解决方案1】:

loadExistingProperties() 中,您为同一文件同时打开FileInputStreamFileOutputStream,但您只想从该文件中读取。调用FileOutputStream 将在您阅读之前删除文件的内容。只需删除该行。

【讨论】:

  • 什么?._。它有效,但我不知道为什么。为什么定义FileOutputStream 似乎会杀死FileInputStream?我的意思是load()只需要输入流。为什么OutputStream会影响它?
  • 这是因为两个流都在同一个文件上工作,这主要是个坏主意。 FileOutputStream 构造函数打开文件进行覆盖,因此它会删除文件的内容。
【解决方案2】:

第一个问题是,无论何时修改属性,都会将整个属性写入output 输出流。这不是它的预期工作方式。

Properties.store() 方法将存储Properties 对象中存储的所有属性。所以你应该在调用store()方法之前打开你的文件并在它之后关闭。

在我看来,您永远不会关闭 output,这可能会导致写入它的数据仍然仅存在于内存缓存中,并且从未写入基础文件。

只需像这样持久化属性:

try (OutputStream out = new FileOutputStream("config.properties")) {
    prop.store(out, null);
}

然后像这样简单地加载它们:

try (InputStream in = new FileInputStream("config.properties")) {
    prop.load(in);
}

try-with-resources 块将正确关闭流。

此外,您不应该在每次修改属性时都保留属性。常见的做法是仅在您关闭程序或用户要求您执行此操作时才保存属性/设置(例如“立即保存设置”菜单)。

【讨论】:

    【解决方案3】:

    我相信当您打开输出流时,它会截断文件的内容。

    已编辑:

    您需要打开输入流,在不打开输出流的情况下读取属性文件的内容。

    如果您以后确实需要保存它们,您仍然可以在 setProperty 方法中打开输出流并调用 store 方法。或者您可以在读取所有属性并关闭输入流后打开输出流。

    请记住,store 方法将再次保存所有属性。

    【讨论】:

    • 这将保留属性文件的原始内容并在其末尾重新写入所有内容 => 属性将在属性文件中多次列出。我怀疑有人会想要这个。
    【解决方案4】:

    我没有看到你的Properties 课程,但在我看来你没有关闭输出流也没有刷新。 执行prop.store(output, null);时文件是否更改?

    【讨论】:

    猜你喜欢
    • 2010-10-02
    • 2014-09-14
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多