重新启动程序后从属性文件中读取

时间:2014-10-09 12:02:13

标签: java properties inputstream outputstream restart

我试图将配置数据保存在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错误的方式吗?我不知道如何以另一种方式做到这一点。

4 个答案:

答案 0 :(得分:2)

loadExistingProperties()中,您为同一个文件打开了FileInputStreamFileOutputStream,但您只想从该文件中读取。调用FileOutputStream将删除文件的内容,然后才能读取它。只需删除该行。

答案 1 :(得分:1)

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

编辑:

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

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

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

答案 2 :(得分:1)

第一个问题是,无论何时修改属性,都要将整个属性写入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 :(得分:0)

我还没有看过你的Properties课,但在我看来你没有关闭输出流也没有看到同花顺。 执行prop.store(output, null);后文件是否会发生变化?