我使用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