如何将 Properties.store() 分隔符符号从 "=" 更改为 ":"?



我最近发现了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个页面,但没有发现有类似的问题。我还检查了Javadoc,没有发现任何函数允许我在不为自己编写类的情况下更改它。我现在想使用Properties,因为它在那里,而且很容易使用。我也有一个想法,在我保存文件后,用:替换所有的=,但也许有人有更好的建议?

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

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

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


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

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

总的来说,我认为这个代码是D质量的。它几乎打破了良好代码和良好风格的所有规则。

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

最新更新