2010-09-19 100 views
1

我使用JAXB,我需要知道生成的XML的长度,所以我当元帅的内容StringWriter,那么哪种方式更好地得到长度:在StringWriter中获取字符串长度?

aStringWriter.getBuffer().length();
or 

aStringWriter.toString().length();

回答

4

编辑:调用toString()将始终创建一个新的字符串...虽然它不需要复制实际的字符数据,只需创建一个新字符串引用当前的char[]与当前的长度和数量。调用getBuffer().length()不需要创建任何额外的对象,所以它的效率稍高。

你对输出做了什么?你不是把它转换成字符串吗?

注意,这里的长度始终处于字符长度虽然,所以这将不适合像的HTTP响应的Content-Length头,其需要在字节的值(即编码后)。我建议你创建一个ByteArrayOutputStream,并且如果可以的话(或者已经忘记了API的样子)直接传递给JAXB,或者创建一个OutputStreamWriter 。这样,您可以改为从ByteArrayOutputStream获得二进制长度。

+0

我将内容添加到HTTP正文,实际上,我需要设置内容长度标头 – mabuzer 2010-09-19 06:54:04

+0

@mabuzer:已编辑。 – 2010-09-19 07:17:24

+0

@JonSkeet一个非常好的回应! 'ByteArrayOutputStream'完美适用于此,因为您可以利用JAXB'Marshaller'来编组该输出流,随后可以将其转换为'byte []'。使用“Charset”和“String.getBytes()”方法的解决方案只适用于字符串。默认情况下,JAXB'Marshaller'使用** UTF-8 **编码,因此编组的'byte []'会给你正确的长度。如果你想使用其他类型的编码,只需使用属性元素“jaxb.encoding”调用'Marshaller.setProperty()'。 – gto406 2011-07-19 18:30:43

1

我这样做

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

作品适合所有UTF-8字符串。