推荐方案是手动写入自定义头后调用 properties.store(writer, null):先用 OutputStreamWriter 指定 UTF-8 编码,写入多行 # 开头的注释(如“生成于:2025-04-01 10:23:45”),再调用 store(writer, null) 跳过默认时间戳,最后 flush 并 close。
java 的 properties.store() 默认会在生成的配置文件顶部写入类似 #mon apr 01 10:23:45 cst 2025 的时间注释,但这个时间是方法内部自动写入的,无法直接自定义格式或内容。若想添加带自定义格式(如“生成于:2025-04-01 10:23:45”)或额外信息(如“由 admin 工具生成”)的注释头,不能仅靠 store(),需绕过其默认行为,手动控制输出。
方案一:用 storeToXML() + 自定义头(不推荐用于 .properties)
storeToXML() 支持传入注释字符串,但它生成的是 XML 格式,不是标准的 .properties 文件,不适用于需要纯 key=value 文本的场景,故此处略过。
方案二:用 store(OutputStream, String) 并预写自定义头(推荐)
Properties.store(OutputStream out, String comments) 会把 comments 参数作为首行注释(自动加 # 并换行),但仅限一行,且仍会追加默认时间戳。要完全替换默认头,必须避免调用该方法,改用 store(Writer, String) 或更底层方式。
正确做法是:不用 store(),而用 store(Writer, null) 配合手动写入自定义头:
- 创建
FileWriter或OutputStreamWriter(注意指定编码,如 UTF-8) - 先手动写入你想要的注释头(可多行,每行以
#开头) - 再调用
properties.store(writer, null),传null可跳过它自带的注释和时间行 - 确保最后调用
writer.flush()和close()
示例代码:
立即学习“Java免费学习笔记(深入)”;
Properties props = new Properties();
props.setProperty("db.url", "jdbc:h2:mem:test");
props.setProperty("db.user", "sa");
<p>try (Writer writer = new OutputStreamWriter(
new FileOutputStream("config.properties"), StandardCharsets.UTF_8)) {</p><pre class='brush:java;toolbar:false;'>// 手动写入自定义头(支持多行)
String timestamp = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
writer.write("# 配置文件自动生成\n");
writer.write("# 生成于:" + timestamp + "\n");
writer.write("# 版本:v1.2.0\n");
writer.write("#\n"); // 空行分隔
// 调用 store,第二个参数为 null,跳过默认注释
props.store(writer, null);}
方案三:重写 store() 行为(高级,适用于封装工具类)
如果项目中频繁使用,可封装一个 CustomProperties 工具方法,内部继承 Properties 或独立实现写入逻辑,核心仍是手动控制 Writer 输出。关键点包括:
- 将
Properties中的键值对转为String列表,按规范转义(如空格、等号、井号需 \ 转义) - 使用
StringEscapeUtils.escapeJava()(Apache Commons)或手写简单转义逻辑 - 按字母序或原始插入序排序后逐行写入,保证可读性
- 把自定义头作为前置内容统一写入
这种方式灵活度最高,但开发成本略高,一般小项目用方案二足够。
注意事项与避坑点
直接操作 Writer 时容易忽略以下细节:
- 编码必须显式指定:否则 Windows 上可能用 GBK 写入中文注释,导致 Linux 下乱码
- 注释行末不能有空格:某些老旧解析器(如 Shell 脚本读取)会因末尾空格误判为无效行
- store(writer, null) 仍会写入空行:它在注释后总加一个空行,所以你的自定义头末尾最好也留一空行,保持视觉一致
- 不要用 FileWriter("xxx") 默认构造:它不指定编码,JDK 依赖平台默认编码,极不安全


















