1

我最近发现了关于java.util.Properties,它允许我在不编写自己的函数的情况下从配置中写入和读取。

我很兴奋,因为它很容易使用,但后来我在存储修改后的配置文件时发现了一个缺陷。

这是我的代码,现在很简单:

FileWriter writer = null;
Properties configFile = new Properties();
configFile.load(ReadFileTest.class.getClassLoader().getResourceAsStream("config.txt"));

String screenwidth = configFile.getProperty("screenwidth");
String screenheight = configFile.getProperty("screenheight");
System.out.println(screenwidth);
System.out.println(screenheight);
configFile.setProperty("screenwidth", "1024");
configFile.setProperty("screenheight", "600");
try {
    writer = new FileWriter("config.txt" );
    configFile.store(writer, null);
} catch (IOException e) {
    e.printStackTrace();
}
writer.flush();
writer.close();

我注意到的问题是我尝试编辑的配置文件是这样存储的:

foo: bar
bar: foo
foobar: barfoo

但是,之后的输出properties.store(writer, null)是这样的:

foo=bar
bar=foo
foobar=barfoo

我编辑的配置文件不适用于我的程序,它适用于其他应用程序,该应用程序需要配置文件采用上面显示的格式并带有:分隔符,否则它将配置重置为默认值。

有谁知道如何轻松改变这一点?

我现在搜索了前 5 个 Google 页面,但没有发现有类似问题的人。我还检查了 Javadoc,发现没有任何函数可以让我在不为自己编写类的情况下更改它。我现在想使用Properties它,因为它在那里并且很容易使用。保存文件后,我也想到了将所有内容替换为所有内容=:但也许有人有更好的建议?

4

2 回答 2

2

不要使用不是为任务设计的工具——不要Properties在这里使用。相反,我只写你自己的——应该很容易。

您仍然可以使用Properties实例作为“存储”,但不要使用它来将属性序列化为文本。相反,只需使用 a FileWriter,遍历属性,然后自己编写行 - as key + ": " + value

于 2012-01-08T15:31:48.213 回答
0

这里有新想法

您关于将 = 转换为:的评论让我想到:Properties.store() 写入流。您可以使用内存中的 ByteArrayOutputStream,在写入文件之前在内存中进行适当的转换,然后写入文件。Properties.load() 也是如此。或者您可以插入 FilterXXXs。(我可能会在记忆中这样做)。


我正在研究子类化有多难。这几乎是不可能的。:-(

如果您查看 Properties 的源代码,(我正在查看 Java 6)store() 调用 store0()。现在,不幸的是,store0 是私有的,不受保护,并且“=”作为魔术常数给出,而不是从属性中读取的东西。它调用了另一个私有方法 saveConvert(),它也有很多神奇的常量。

总的来说,我将此代码评为 D- 质量。它几乎打破了良好代码和良好风格的所有规则。

但是,它是开源的,因此,理论上,您可以将一堆代码复制并粘贴(并改进!)到您自己的 BetterProperties 类中。

于 2012-01-28T02:23:17.417 回答