2

我正在使用java.util.Properties#store()方法将我的属性保存到文件中:

os = new BufferedOutputStream(new FileOutputStream(propertiesFile));
properties.store(os, null);

此方法的默认实现始终将注释写为当前的第一行timestamp

#Thu May 16 12:55:36 EDT 2013

我的应用程序不需要这种行为,因为我需要跟踪属性文件中的所有更改。是否可以以某种方式从属性文件中过滤此注释行(以及所有其他行)?

我对“即时”解决方案特别感兴趣,而无需事后对文件进行后处理。

4

3 回答 3

2

是的你可以 :)。

首先,您可以扩展Properties和覆盖store()方法。但是这种方式太复杂了。

你可以做得更好。检查源代码store()。它调用store()实​​际完成工作的私有方法。该方法调用

bw.write("#" + new Date().toString());

在一开始的时候。你不想看到这条线。这意味着您必须实现自己的BufferedWriter忽略第一行打印。

public class IgnoreFirstLineBufferedWriter extends BufferedWriter {
    private int lineCouner = 0;
    // constructors - implement them yourself

    @Override
    public void write(String str) throws IOException {
        if (lineCounter > 0) {
            super.write(str);
        }
        lineCounter++;
    }
}

现在,您可以BufferedWriter在包装FileOutputStream和调用时使用此自定义store()

props.store(new IgnoreFirstLineBufferedWriter(new OutputStreamWriter(new FileOutputStream("myprops.properties"))));

于 2013-05-16T17:12:50.333 回答
0

此时间戳以私有方法打印在 Properties 上,并且没有控制该行为的属性。如果要更改此行为,则可能需要继承属性,覆盖 store 方法并复制/粘贴 store0 方法的内容,以便不会打印日期注释。

于 2013-05-16T17:06:56.317 回答
0

使用 storeToXML 方法时不打印日期。但是属性将存储在 XML 中(否则最好的方法是扩展 Properties 类,如前所述

于 2013-05-16T17:17:46.597 回答