2012-01-08 89 views
1

我最近发现了约java.util.Properties,它允许我编写和读取配置,而无需编写自己的函数。如何将Properties.store()分隔符从“=”更改为“:”?

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

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

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,因为它在那里并且很容易使用。 我也想到了在保存文件后,将=全部替换为:,但也许有人得到了更好的建议?

回答

2

请勿使用未针对任务设计的工具 - 请勿在此处使用Properties。相反,我只是写自己的 - 应该很容易。

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

+0

这是一个不错的主意,我只是使用Properties来读取文件和一个FileWriter来存储它,谢谢你现在就试试。 – user1137183 2012-01-08 15:35:59

+0

但是,请检查Properties.saveConvert()和loadConvert()是如何转义特殊字符的。这对你来说可能是一个重大问题。 – user949300 2012-01-28 02:24:25

0

新的想法在这里

您对转换=要评论:让我想:Properties.store()写入到流。您可以使用内存中的ByteArrayOutputStream,在之前将内存转换为适当的内容,然后写入文件。同样对于Properties.load()。或者你可以插入FilterXXXs。 (我可能会在记忆中)。


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

如果你看一下Properties的源代码,我正在看Java 6 store()调用store0()。现在,不幸的是,store0是私有的,没有被保护,“=”它是一个魔术常数,不是从属性读取的,它调用另一个叫做save​​Convert()的私有方法,它也有很多魔术常量。几乎所有的优秀代码和良好风格的规则。

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