java properties 转 xml 用 jdk 自带 storetoxml() 即可,但需注意:第二个参数为注释(可 null),第三个为编码(必须显式指定 utf-8);xml 转回须用 loadfromxml(),且结构必须为 ...;键值转义、编码差异、顺序丢失、注释不保留等问题导致 round-trip 不一致。

Java Properties 转 XML 用 storeToXML() 就够了
不用额外依赖,JDK 自带的 Properties 类就支持直接写成 XML 格式。关键不是“能不能”,而是参数和编码容易出错。
-
storeToXML()第二个参数是注释(可为null),第三个参数才是编码;传错顺序会抛NullPointerException或生成乱码 - 必须用
UTF-8显式指定编码,否则默认用系统平台编码(Windows 上常是GBK),中文保存后读不出来 - XML 输出里键值会被转义:
key=value&name中的&变成&,这是标准行为,不是 bug
示例:
Properties props = new Properties();
props.setProperty("db.url", "jdbc:mysql://localhost:3306/test");
props.setProperty("user.name", "张三");
try (FileOutputStream out = new FileOutputStream("config.xml")) {
props.storeToXML(out, "Generated by Java", "UTF-8");
}
XML 转回 Properties 必须用 loadFromXML(),不能用 load()
load() 只认传统 key=value 文本格式,拿 XML 文件去喂它会报
Invalid Unicode character` 错误,甚至静默失败(只加载前几行)。</p> <ul> <li><code>loadFromXML()对 XML 结构敏感:根节点必须是
<?xml ...?><properties><entry key="...">...</entry></properties>,手写 XML 时漏掉 <properties></properties> 外层就会抛 Invalid properties format
xml.etree),可能用了自定义命名空间或属性,loadFromXML() 一律不认
才能被正确还原,直接换行会导致解析中断中文、特殊字符、空格在两种格式里表现不一致
properties 原生不支持键名含空格或点号以外的符号,而 XML 没这限制;但反过来,XML 里 、<code>> 会被转义,properties 里却原样存——转换不是对等映射。
立即学习“Java免费学习笔记(深入)”;
- 键名为
my.key.name没问题,但my key name在 properties 中会被当成三个键(空格分隔),XML 却允许 - 值含
\u4f60\u597d这种 Unicode 转义,在 properties 文件里能被load()识别,但在 XML 里必须写成实际汉字或你好 -
storeToXML()会把所有非 ASCII 字符转成数字字符引用(xxx;),即使你指定了 UTF-8;这是 JDK 行为,改不了
别指望 round-trip 完全一致,尤其涉及注释和顺序
properties 文件本身无序,Properties 类内部用 Hashtable(Java 8+ 是 HashMap)存,遍历时顺序不确定;XML 转出来顺序是随机的,再读回去更没法保证。
- 原始 properties 里的注释(
#或!开头)在 XML 中彻底丢失,storeToXML()不保留它们 - 重复键在 properties 中后出现的覆盖前面的,XML 中若手工写了两个同 key 的
<entry></entry>,loadFromXML()只取最后一个——这点倒是一致 - 如果项目里真需要保序+保注释,别用
Properties,改用java.util.prefs.Preferences或轻量 YAML 库(如 SnakeYAML)
真正麻烦的从来不是怎么转,而是转完之后发现某处中文变问号、某行配置莫名其妙消失、或者 CI 环境里因为默认编码不同导致本地好使线上炸锅。









