当我更新属性文件时,注释也会沿着数据更新。有没有任何可能的方法来删除注释或更新数据而不发表评论。
这里我每次将日期时间戳附加为注释
时更新文件4次#Thu May 19 17:53:42 GMT+05:30 2011
Key_1=DSA_1024
#Thu May 19 17:53:43 GMT+05:30 2011
Key_2=DSA_1024
#Thu May 19 17:53:43 GMT+05:30 2011
Key_3=DSA_1024
#Thu May 19 17:53:44 GMT+05:30 2011
Key_4=DSA_1024
码
Properties prop=new Properties();
String currentDirectary=System.getProperty("user.dir");
String path=currentDirectary+"/Resource/Key.Properties";
FileOutputStream out=new FileOutputStream(path,true);
prop.setProperty("keyName","DSA_1024");
prop.store(out, null);
答案 0 :(得分:2)
我曾经不得不这样做,因为属性文件的使用者无法处理属性。 store
方法生成的注释定义明确,因此很容易跳过它:
Writer stringOut = new StringWriter();
properties.store(stringOut, null);
String string = stringOut.toString();
String sep = System.getProperty("line.separator");
out.write(string.substring(string.indexOf(sep) + sep.length()));
答案 1 :(得分:1)
来自properties.store()的JavaDocs
如果comments参数不为null,则首先将ASCII#字符,注释字符串和行分隔符写入输出流。因此,评论可以作为识别评论。
接下来,始终会写入注释行,其中包含ASCII#字符,当前日期和时间(就像当前时间的Date的toString方法生成的那样),以及Writer生成的行分隔符。
我能想到的唯一选择是编写yourOutputStream实现来删除注释。 (或者只是学会和他们一起生活:))
答案 2 :(得分:1)
以上是使用正确编码的hack的改进。
FileOutputStream out = new FileOutputStream(filename);
ByteArrayOutputStream arrayOut = new ByteArrayOutputStream();
props.store(arrayOut, null);
String string = new String(arrayOut.toByteArray(), "8859_1");
String sep = System.getProperty("line.separator");
String content = string.substring(string.indexOf(sep) + sep.length());
out.write(content.getBytes("8859_1"));
答案 3 :(得分:0)
在groovy中,我写了这个以完全删除属性中的注释。
String writeProperties(Properties properties) {
def writer = new StringWriter()
properties.each { k, v ->
writer.write("${k}=${v}${System.lineSeparator()}")
}
writer.toString()
}
这应该很容易转换为常规java。