2010-09-04 4 views
3

Auparavant, pour lire XML en encodage UTF-8 par Xstream, je me sers DomDriver comme suit:Xstream - manière correcte pour enregistrer XML en UTF-8

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

Cependant, je me rends compte plus tard c'est Très lent. J'utilise la manière suivante:

Optimize loading speed of xstream

Cela fonctionne bien au moins.

Cependant, plus tard, je me rends compte que la même technique ne peut pas être appliquée pour écrire du XML. Je vais avoir tout ??? personnages.

Ceci est le dernier code réalisable en utilisant DomDriver au cours écrire

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; 
} 

Le code ci-dessus fonctionne très bien. Afin de correspondre à la méthode read qui n'utilise pas DomDriver, je change le code pour

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; 
} 

Cette fois, tous mes caractères chinois changements ???

Puis-je savoir quelque chose que j'avais mal fait?

+0

Salut - Que passes-tu comme 'objet' dans la méthode ci-dessus? – ziggy

Répondre

11

Regardez ce code:

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

Vous la création un écrivain qui utilisera UTF-8 - mais ignorant complètement!

Essayez ceci:

xStream.toXML(object, writer); 

également comme une question de style, je vous encourage à considérer les points suivants:

  • Ne pas comparer les résultats avec des constantes booléennes; il suffit d'utiliser if (foo) ou if (!foo) à la place
  • Attraper Exception est très rarement une bonne idée; attraper des exceptions spécifiques à la place
  • Renvoyer une valeur booléenne pour indiquer le succès ou l'échec n'est pas idiomatique Java; généralement si quelque chose échoue, une exception est meilleure
  • Si le premier close échoue, vous quittez la méthode avant le deuxième appel close, ce qui n'est probablement pas ce que vous voulez. (En fait, la fermeture de la OutputStreamWriter` fermera le flux de toute façon, mais considérer le principe de la chose.)
  • Définition des variables locales à null à la fin d'une méthode est inutile et encombre votre code
+0

@Jon Oh mon Dieu! Vous avez un oeil aiguisé! –

+0

Je pense qu'il y a erreur supplémentaire, je ne devrais pas revenir en bloc finalement. Au lieu de cela, je devrais utiliser boolean status = close (writer); status = status & close (outputStream); ... et retourne l'état juste à la toute fin de la méthode. –

+0

@Yan: Le retour d'un bloc finally est acceptable tant que vous faites attention. En particulier, revenir de la * fin * d'un bloc finally est bien. Vous ne voulez pas manquer une partie de votre code de nettoyage en raison du retour à mi-chemin. –

Questions connexes