我使用JAXB
,我需要知道生成的XML的长度,所以我当元帅的内容StringWriter
,那么哪种方式更好地得到长度:在StringWriter中获取字符串长度?
aStringWriter.getBuffer().length();
or
aStringWriter.toString().length();
?
我使用JAXB
,我需要知道生成的XML的长度,所以我当元帅的内容StringWriter
,那么哪种方式更好地得到长度:在StringWriter中获取字符串长度?
aStringWriter.getBuffer().length();
or
aStringWriter.toString().length();
?
编辑:调用toString()
将始终创建一个新的字符串...虽然它不需要复制实际的字符数据,只需创建一个新字符串引用当前的char[]
与当前的长度和数量。调用getBuffer().length()
不需要创建任何额外的对象,所以它的效率稍高。
你对输出做了什么?你不是把它转换成字符串吗?
注意,这里的长度始终处于字符长度虽然,所以这将不适合像的HTTP响应的Content-Length头,其需要在字节的值(即编码后)。我建议你创建一个ByteArrayOutputStream
,并且如果可以的话(或者已经忘记了API的样子)直接传递给JAXB,或者创建一个OutputStreamWriter
。这样,您可以改为从ByteArrayOutputStream
获得二进制长度。
我这样做
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字符串。
我将内容添加到HTTP正文,实际上,我需要设置内容长度标头 – mabuzer 2010-09-19 06:54:04
@mabuzer:已编辑。 – 2010-09-19 07:17:24
@JonSkeet一个非常好的回应! 'ByteArrayOutputStream'完美适用于此,因为您可以利用JAXB'Marshaller'来编组该输出流,随后可以将其转换为'byte []'。使用“Charset”和“String.getBytes()”方法的解决方案只适用于字符串。默认情况下,JAXB'Marshaller'使用** UTF-8 **编码,因此编组的'byte []'会给你正确的长度。如果你想使用其他类型的编码,只需使用属性元素“jaxb.encoding”调用'Marshaller.setProperty()'。 – gto406 2011-07-19 18:30:43