Java 如何将Properties.store()分隔符符号从"=&引用;“到”&引用;?
我最近发现了Java 如何将Properties.store()分隔符符号从"=&引用;“到”&引用;?,java,properties,divider,colon,Java,Properties,Divider,Colon,我最近发现了java.util.Properties,它允许我从配置中写入和读取,而无需为配置编写自己的函数 我很兴奋,因为它很容易使用,但后来我在存储修改后的配置文件时发现了一个漏洞 以下是我的代码,目前非常简单: FileWriter writer = null; Properties configFile = new Properties(); configFile.load(ReadFileTest.class.getClassLoader().getResourceAsStream("
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
实例作为“存储”,但不要将属性序列化为文本。相反,只需使用FileWriter
,遍历属性,然后自己编写这些行-作为key+”:“+value
此处的新想法
您关于将=转换为:的评论让我想到:Properties.store()会写入流。您可以使用内存中的ByteArrayOutputStream,在写入文件之前在内存中进行适当的转换,然后写入文件。对于Properties.load()也是如此。或者您可以插入filterxxx。(我可能会在记忆中这样做)
我在研究子类化有多难。这几乎是不可能的-(
如果你看属性的源代码,(我看的是Java 6)store()调用store0()。不幸的是,store0是私有的,不受保护,“=”是作为一个魔法常量给出的,而不是从属性读取的。它调用另一个名为saveConvert()的私有方法,该方法也有很多魔法常量
总的来说,我把这段代码评为D-quality。它几乎打破了好代码和好风格的所有规则
但是,它是开源的,因此,从理论上讲,您可以将一组代码复制并粘贴(并改进!)到您自己的BetterProperties类中。这是一个非常好的主意,我将使用属性读取文件,并使用FileWriter将其存储回去,谢谢您现在就尝试。不过,请检查Properties.saveConvert()和loadConvert()是如何实现的转义特殊字符。这对您来说可能是一个重要问题。