java - 将属性写入文件时过滤掉注释

标签 java properties

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

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

此方法的默认实现始终将注释写入带有当前时间戳的第一行:

#Thu May 16 12:55:36 EDT 2013

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

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

最佳答案

是的,你可以:)。

首先,您可以扩展 Properties 并重写 store() 方法。但这种方式太复杂了。

你可以做得更好。检查 store() 的源代码。它调用实​​际执行工作的私有(private)方法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++;
    }
}

现在,当您包装 FileOutputStream 并调用 store() 时,您可以使用这个自定义的 BufferedWriter:

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

关于java - 将属性写入文件时过滤掉注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593357/

相关文章:

java - 在 Java 中实现与 C++ 中的析构函数相同的结果

java - 另一个属性键中使用的 Spring-boot 属性值

iphone - 是否可以在 Cocoa Touch 中观察对象的只读属性?

c# - 未使用的属性会导致开销吗?

c# - 仅在反序列化时设置

javascript - 在 JavaScript 中添加对象属性

java - 如何防止Android应用程序多次加载?

java - Java中根据线程划分循环执行

java - 生产者消费者多线程为什么需要Thread.sleep?

java - 给定一个句子,单词之间有多个空格。删除多余的空格,使句子中的单词之间只有一个空格