2010-09-19 101 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字符串。