Apache Commons Configuration2保存时转义特殊字符问题求助
解决Apache Commons Configuration2保存时特殊字符转Unicode的问题
我之前在使用Apache Commons Configuration2管理属性文件时,也碰到过一模一样的问题——保存时像Rumänien这类带特殊字符的内容会被转成Rum\u00E4nien,读取时没问题但保存后的文件可读性极差。不用Builder也能搞定,优先用你提到的FileHandler/Writer方案,具体操作如下:
核心原因
默认情况下,Apache Commons Configuration2的PropertiesWriter会沿用Java原生Properties类的行为:将非ASCII字符自动转义为Unicode格式。要解决这个问题,关键就是禁用这个转义逻辑,同时确保文件用UTF-8编码保存避免乱码。
方案1:用FileHandler自定义WriterFactory
如果你习惯用FileHandler管理配置文件,可以通过自定义WriterFactory来创建禁用Unicode转义的PropertiesWriter:
import org.apache.commons.configuration2.PropertiesConfiguration; import org.apache.commons.configuration2.io.FileHandler; import org.apache.commons.configuration2.io.WriterFactory; import org.apache.commons.configuration2.PropertiesConfiguration.PropertiesWriter; import java.io.*; import java.nio.charset.StandardCharsets; // 假设你已经初始化好配置对象 PropertiesConfiguration config = new PropertiesConfiguration(); config.setProperty("a", "Rumänien"); // 创建FileHandler并关联配置和目标文件 FileHandler handler = new FileHandler(config); handler.setFile(new File("your-config.properties")); // 确保读取/保存都用UTF-8编码 handler.setEncoding(StandardCharsets.UTF_8.name()); // 自定义WriterFactory,生成禁用Unicode转义的PropertiesWriter handler.setWriterFactory(new WriterFactory() { @Override public Writer createWriter(OutputStream out) throws IOException { // 先创建UTF-8编码的OutputStreamWriter OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8); // 第二个参数设为false,禁用Unicode转义 return new PropertiesWriter(osw, false); } }); // 执行保存 handler.save();
方案2:直接用PropertiesWriter写入
如果不想用FileHandler,也可以直接通过PropertiesWriter手动写入配置,同样禁用转义:
import org.apache.commons.configuration2.PropertiesConfiguration; import org.apache.commons.configuration2.PropertiesConfiguration.PropertiesWriter; import java.io.*; import java.nio.charset.StandardCharsets; PropertiesConfiguration config = new PropertiesConfiguration(); config.setProperty("a", "Rumänien"); // 用try-with-resources确保Writer自动关闭 try (OutputStream out = new FileOutputStream("your-config.properties"); OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8); PropertiesWriter writer = new PropertiesWriter(osw, false)) { config.write(writer); } catch (IOException e) { // 处理IO异常 e.printStackTrace(); }
关键注意事项
- 必须指定UTF-8编码:不管是保存还是读取,都要确保用UTF-8处理文件,否则特殊字符可能出现乱码。
PropertiesWriter的第二个构造参数:false表示禁用Unicode转义,这是解决问题的核心开关。- 读取配置时:如果之前的文件是用默认转义方式保存的,不用担心——Configuration2读取时会自动解析Unicode转义符,还原成正确的字符(你已经提到读取正常,这点应该没问题)。
内容的提问来源于stack exchange,提问作者delcanovega
相关产品推荐
相关产品推荐

