问题:

按平常的方法,使用dom4j的XMLWriter写Xml文件时出现了乱码问题

public static boolean xmlWrite(String vpath, String node, String value) {
SAXReader saxReader = new SAXReader();
Document doc;
try {
doc = saxReader.read(new File(vpath));// 加载xml文件
Element boot = doc.getRootElement();// 获取根节点
Element el = getXmlElement(boot, node);
el.setText(value);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8"); //按示例的做法使用了FileWriter
XMLWriter xmlWriter = new XMLWriter(new FileWriter(vpath), format);
xmlWriter.write(doc);
xmlWriter.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

写入Xml后文件出现中文乱码问题。

原因:

因为FileWriter无法处理编码,虽然代码中使用format.setEncoding("utf-8"),但只是把文件头指定为utf-8,写入的时候没有真正转码。只有使用OutputStream类的方法(此处使用继承类FileOutputStream)才能转码指定的编码。

解决方案:

将new XMLWriter(new FileWriter(vpath), format)中的FileWriter改为FileOutputStream

修改后的代码如下:

public static boolean xmlWrite(String vpath, String node, String value) {
SAXReader saxReader = new SAXReader();
Document doc;
try {
doc = saxReader.read(new File(vpath));// 加载xml文件
Element boot = doc.getRootElement();// 获取根节点
Element el = getXmlElement(boot, node);
el.setText(value);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8"); //FileWriter改为FileOutputStream解决乱码问题
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(vpath), format);
xmlWriter.write(doc);
xmlWriter.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

运行后,写入的文件正常了。