删除java属性文件中的注释

删除java属性文件中的注释,java,Java,当我更新属性文件时,注释也会随数据一起更新。是否有任何可能的方法删除注释或在不添加注释的情况下更新数据 在这里,每次将日期时间戳作为注释附加时,我都会更新文件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:

当我更新属性文件时,注释也会随数据一起更新。是否有任何可能的方法删除注释或在不添加注释的情况下更新数据

在这里,每次将日期时间戳作为注释附加时,我都会更新文件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
代码


从属性的JavaDocs.store()中

如果comments参数不为null,则首先将ASCII字符、注释字符串和行分隔符写入输出流。因此,这些注释可以用作识别注释

接下来,将始终写入注释行,由ASCII字符、当前日期和时间(就好像是由当前时间的toString日期方法生成的)以及编写器生成的行分隔符组成


我能想到的唯一选择是编写自己的OutputStream实现来删除注释。(或者只是学会与它们共处:)

我曾经不得不这样做,因为属性文件的使用者无法处理属性。
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()));

这是对上面的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"));

在groovy中,我写这篇文章是为了从属性中完全删除注释

String writeProperties(Properties properties) {
    def writer = new StringWriter()
    properties.each { k, v ->
         writer.write("${k}=${v}${System.lineSeparator()}")
    }
    writer.toString()
}

这应该很容易转换为常规java。

谁添加了这些注释?您使用的是什么工具。向我们展示一些更新属性文件的代码行。看起来您使用了
properties.store()
来附加到现有文件,而不是使用它。您应该将所有需要的属性添加到一个
properties
对象中,并在该对象上调用
store()
。注释将自动添加。我正在使用eclipse,并且属性文件存在于我的eclipse工作区中。@Joachim Saue我修改了代码,现在正在工作,非常感谢
String writeProperties(Properties properties) {
    def writer = new StringWriter()
    properties.each { k, v ->
         writer.write("${k}=${v}${System.lineSeparator()}")
    }
    writer.toString()
}