2010-09-19 5 views

Répondre

4

EDIT: L'appel toString() va toujours créer une nouvelle chaîne ... bien qu'il n'aura pas besoin de copier les données de caractères réelles, il suffit de créer une nouvelle chaîne faisant référence au char[] actuel avec la longueur et le nombre actuels. Appeler getBuffer().length() n'a pas besoin de créer aucun objets supplémentaires cependant, donc c'est légèrement plus efficace.

Mais que faites-vous avec la sortie? Vous ne le convertissez pas en une chaîne de toute façon?

Notez que la longueur ici sera toujours la longueur en caractères, donc il ne sera pas adapté à quelque chose comme l'en-tête Content-Length des réponses HTTP, qui a besoin de la valeur en octets (c.-à- après l'encodage).

EDIT: Bon, si vous voulez plutôt compter les octets, je vous suggère de créer un ByteArrayOutputStream, et de le passer directement à JAXB si vous le pouvez (j'ai oublié à quoi ressemble l'API) ou de créer un OutputStreamWriter . De cette façon, vous pouvez obtenir la longueur binaire à la place de ByteArrayOutputStream à la place.

+0

J'ajoute le contenu au corps HTTP, et oui en fait, je dois définir l'en-tête Content-Length – mabuzer

+0

@mabuzer: Edited. –

+0

@JonSkeet Une très bonne réponse! 'ByteArrayOutputStream' fonctionnera parfaitement pour cela, car vous pouvez utiliser le Marshaller' de JAXB pour marshall dans ce flux de sortie, qui peut ensuite être converti en' byte [] '. La solution utilisant une méthode 'Charset' et une' String.getBytes() 'fonctionne bien pour une chaîne seulement. Un JAXB 'Marshaller' utilise par défaut le codage ** UTF-8 **, donc le' byte [] 'de la liste de contrôle qui en résulte vous donnera la bonne longueur. Si vous souhaitez utiliser un autre type d'encodage, appelez simplement 'Marshaller.setProperty()' en utilisant l'élément de propriété 'jaxb.encoding'. – gto406

1

Je le fais

Charset UTF8Charset = Charset.forName("UTF8"); 
String output = stringWriter.toString(); 
response.setContentType("application/xml"); 
response.setContentLength(output.getBytes(UTF8Charset).length); 
PrintWriter out = response.getWriter(); 
out.print(output); 

fonctionne parfaitement avec toutes les chaînes UTF-8.

Questions connexes