我最近发现了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
,因为它在那里并且很容易使用。
我还想到在保存文件后用=
替换所有:
,但也许有人得到了更好的建议?
答案 0 :(得分:2)
请勿使用非专为此任务设计的工具 - 请勿在此处使用Properties
。相反,我只是写自己的 - 应该很容易。
您仍然可以使用Properties
实例作为“商店”,但不要将其用于将属性序列化为文本。相反,只需使用FileWriter
,遍历属性,然后自己编写行 - key + ": " + value
。
答案 1 :(得分:0)
这里的新想法
您关于将=转换为的评论:让我思考:Properties.store()写入Stream。您可以使用内存中的ByteArrayOutputStream,在写入文件之前在内存中进行适当转换,然后编写该文件。同样适用于Properties.load()。或者您可以插入FilterXXXs。 (我可能会在记忆中这样做。)
我正在研究子类的难度。这几乎是不可能的。 : - (
如果查看Properties的源代码,(我正在查看Java 6)store()调用store0()。现在,不幸的是,store0是私有的,没有受到保护,而“=”是作为魔术常量给出的,而不是从属性读取的东西。它调用另一个名为saveConvert()的私有方法,该方法也有很多魔术常量。
总的来说,我将此代码评为D-质量。它打破了几乎所有良好代码和良好风格的规则。
但是,它是开源的,所以,理论上,你可以将一堆代码复制并粘贴(并改进!)到你自己的BetterProperties类中。