2010-09-04 49 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