2010-09-04 90 views
3

以前,要读取UTF-8编码 XML通过XStream的,我使用DomDriver如下:XStream的 - 正确的方式来保存XML的UTF-8

XStream xStream = new XStream(new DomDriver("UTF-8")); 

然而,后来我意识到这是非常慢。我用下面的方法:

Optimize loading speed of xstream

这工作至少罚款。

但是,后来我意识到相同的技术不能用于写入XML。我会得到所有?字符。

这期间

public static boolean toXML(Object object, File file) { 
    XStream xStream = new XStream(new DomDriver("UTF-8")); 
    OutputStream outputStream = null; 

    try { 
     outputStream = new FileOutputStream(file); 
     xStream.toXML(object, outputStream); 
    } 
    catch (Exception exp) { 
     log.error(null, exp); 
     return false; 
    } 
    finally { 
     if (false == close(outputStream)) { 
      return false; 
     } 
     outputStream = null; 
    } 

    return true; 
} 

上面的代码工作正常使用DomDriver最后一个可行的代码。为了配合与方法不使用DomDriver,我修改代码,

public static boolean toXML(Object object, File file) { 
    XStream xStream = new XStream(); 
    OutputStream outputStream = null; 
    Writer writer = null; 

    try { 
     outputStream = new FileOutputStream(file); 
     writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8")); 
     xStream.toXML(object, outputStream); 
    } 
    catch (Exception exp) { 
     log.error(null, exp); 
     return false; 
    } 
    finally { 
     if (false == close(writer)) { 
      return false; 
     } 
     if (false == close(outputStream)) { 
      return false; 
     } 
     writer = null; 
     outputStream = null; 
    } 

    return true; 
} 

这一次,我所有的中国角色的变化???

我可以知道我做错了什么吗?

+0

喜 - 你在上述方法中作为“对象”传递什么? – ziggy 2014-02-17 19:01:21

回答

11

看看这段代码:

outputStream = new FileOutputStream(file); 
writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8")); 
xStream.toXML(object, outputStream); 

创建将使用UTF-8作家 - 但后来完全无视吧!

试试这个:

xStream.toXML(object, writer); 

而且作为一个风格问题,我建议你考虑以下几点:

  • 不要比较布尔常量的结果;只需使用if (foo)if (!foo)代替
  • 捕捉Exception非常很少是一个好主意;捕获特定的异常
  • 返回布尔值以指示成功或失败不是惯用的Java;一般情况下,如果出现问题,例外情况会更好
  • 如果第一个close失败,则表明您在第二个close调用之前退出该方法,这可能不是您想要的。 (事实上​​,关闭OutputStreamWriter`无论如何都会关闭流,但考虑到原则的事情。)
  • 在方法的末尾设置局部变量null是不必要的杂波您的代码
+0

@Jon哦,我的上帝!你有一个敏锐的眼睛! – 2010-09-04 16:07:51

+0

我觉得还有其他的错误,我不应该在最后的块中返回。相反,我应该使用布尔状态=关闭(作家); status = status&close(outputStream); ...并返回方法最后的状态。 – 2010-09-04 16:15:35

+0

@Yan:只要你小心点,从finally块返回就没关系。特别是,从finally块的* end *返回是很好的。你只是不想错过你的一些清理代码,因为它返回的一半。 – 2010-09-04 16:19:23