xstream - bonne manière d'économiser de XML en UTF-8
Précédemment, à lire XML en UTF-8 par xstream, je suis en utilisant DomDriver comme suit :
XStream xStream = new XStream(new DomDriver("UTF-8"));
Cependant, plus tard, je réalise que c'est TRÈS lent. J'utilise de la manière suivante :
Optimiser la vitesse de chargement de xstream
Cela fonctionne bien au moins.
Cependant, plus tard, je me rends compte de la même technique ne peut pas être appliqué à écrire du XML. Je seront obtenir tous ??? des personnages.
C'est la dernière réalisable code à l'aide de DomDriver pendant é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 avec la lire méthode qui n'utilise pas de DomDriver, j'ai modifier 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;
}
Ce moment, tous mes caractères Chinois changements ???
Mai je sais tout ce que j'avais fait de mal?
OriginalL'auteur Cheok Yan Cheng | 2010-09-04
Vous devez vous connecter pour publier un commentaire.
Regardez ce code:
Vous êtes la création de un écrivain qui va utiliser l'UTF-8 - mais alors complètement l'ignorer!
Essayez plutôt ceci:
Aussi comme une question de style, je vous encourage d'ailleurs à considérer ce qui suit:
if (foo)
ouif (!foo)
au lieuException
est très rarement une bonne idée; attraper des exceptions spécifiques au lieuclose
échoue, vous cessez de fumer la méthode avant de la deuxièmeclose
d'appel, qui n'est probablement pas ce que vous voulez. (En fait, la fermeture de la OutputStreamWriter " sera de fermer le flux de données de toute façon, mais d'envisager le principe de la chose).null
à la fin d'une méthode est inutile et finit par encombrer votre codeJe pense qu'il est additionnel erreur, je ne devrais pas retourner dans le bloc finally. Au lieu de cela, je dois utiliser les booléens statut = fermer(écrivain); statut = & close(outputStream);... et le retour à l'état juste à la fin de la méthode.
De retour d'un bloc finally est bon, aussi longtemps que vous êtes prudent. En particulier, le retour de la fin d'un bloc finally est très bien. Vous ne voulez pas passer à côté de certains de vos code de nettoyage en raison de retour mi-chemin à travers elle.
Plus important encore - le changement d'utiliser
writer
dans letoXML
appelez le travail pour vous? 🙂Oui. toXML œuvres. Concernant votre commentaire sur enfin, avez-vous vu cela? stackoverflow.com/questions/48088/...
OriginalL'auteur Jon Skeet