Java中将XML写入文件并指定编码,核心是用Transformer设置OutputKeys.ENCODING并配合OutputStreamWriter(如UTF-8),确保声明与实际编码一致;直接使用StreamResult(File)会导致声明与字节编码不匹配而乱码。

Java中将XML文档写入文件并指定编码,核心是使用Transformer配合OutputKeys.ENCODING设置编码,并确保输出流(或Writer)与之匹配。关键在于:编码必须在Transformer中声明,且底层输出目标需支持该编码(如用FileOutputStream时需包装为OutputStreamWriter,或直接用StreamResult接受Writer)。
使用Transformer + OutputStreamWriter(推荐)
这是最可控、兼容性最好的方式,能明确指定字符编码,避免平台默认编码干扰。
- 创建
Document或从解析获得DOM树 - 获取
TransformerFactory并新建Transformer - 设置
OutputKeys.ENCODING为所需编码(如"UTF-8") - 用
FileOutputStream构造OutputStreamWriter,指定相同编码 - 将
OutputStreamWriter封装为StreamResult传给transform()
示例代码:
Document doc = ... // 已构建好的DOM文档
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
try (Writer writer = new OutputStreamWriter(
new FileOutputStream("output.xml"), StandardCharsets.UTF_8)) {
transformer.transform(new DOMSource(doc), new StreamResult(writer));
}
直接使用StreamResult(File)的注意事项
若直接传new StreamResult(new File("output.xml")),Transformer会内部用平台默认编码写入,OutputKeys.ENCODING仅影响XML声明(如),实际字节可能乱码。
立即学习“Java免费学习笔记(深入)”;
- 不建议这种方式指定编码——声明和实际不一致,Windows上常出GBK/UTF-8混用问题
- 仅当明确接受系统默认编码(且所有环境一致)时才可考虑
- XML声明中的encoding属性不会强制转换字节,它只是提示解析器“我存成这样”
使用JAXB(适合POJO转XML)
如果XML由Java对象(JAXB-annotated类)生成,可通过JAXBContext和Marshaller控制编码:
- 调用
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8") - 再用
marshaller.marshal(obj, writer),其中writer为OutputStreamWriter(指定UTF-8) - 同样需保证Writer和setProperty中编码一致
示例片段:
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
try (Writer writer = new OutputStreamWriter(
new FileOutputStream("data.xml"), StandardCharsets.UTF_8)) {
marshaller.marshal(myObject, writer);
}
验证写入是否正确
写完后不要只看IDE打开效果——部分编辑器自动猜测编码。建议:










