2009-05-06 69 views
0

我有一個輸入ByteArrayOutputStream,需要將其轉換爲CharBuffer。ByteArrayOutputStream到CharBuffer

我試圖避免創建一個新的字符串。無論如何要這樣做。

我試圖做到以下,但我沒有字符串的編碼,所以下面的代碼將無法正常工作(輸出無效)。

ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray()); 
CharBuffer document = byteBuffer.asCharBuffer(); 

回答

2

您必須提供編碼。班級如何知道如何轉換。在寫入ByteOutputStream或完全避免流之前,您不能確定編碼嗎?如果沒有,你需要做的假設,並可能失敗

提供的編碼可以在字節的緩衝區轉換成字符緩衝區

Charset charset = Charset.forName("ISO-8859-1"); 
CharsetDecoder decoder = charset.newDecoder(); 
CharBuffer charBuffer = decoder.decode(yourByteBuffer); 
+0

我可以設置編碼,但我在哪裏設置它來獲得字符緩衝區。 – 2009-05-06 20:33:05

+0

我編輯了答案來顯示轉換 – 2009-05-06 21:31:58

0

ByteBuffer.asCharBuffer給你一個非常字面2 byte s到char(或大或小尾數)更新反映在兩個緩衝區中。

大概你想通過一些合理的編碼從byte s到char s。有很多方法可以做到這一點。例如[new String(byte [],String encoding)] [1]。他們大多會以某種形式通過CharsetEncoder。那麼它應該是直接從那裏得到CharBuffer

CharBuffer是一個相當低級別的事情。你確定這真的是你想要的嗎?

[1]:http://file:///C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte[],java.lang.String中)

0

ByteBuffer.asCharBuffer()假定字節是UTF-16。 (我在文檔中找不到任何明確說明這一點的文檔,但實現只是將字節對視爲字符的低字節和高字節)。如果您需要另一種編碼,則必須使用不同的方法。

最簡單的方法是隻創建一個String

CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding)); 

我知道你說你是「試圖避免創建一個新的字符串」,但您的代碼段是無論如何分配一個單獨的字節數組(ByteArrayOutputStream.toByteArray() 「根據文檔創建一個新分配的字節數組」)。因爲CharBuffer支持隨機訪問,並且許多編碼(特別是UTF-8)是可變寬度的,所以最好將整個事件轉換爲前面的字符。

如果你真的只想對字符進行流式訪問(而不是隨機訪問),那麼可能CharBuffer不是底層代碼接受的最佳接口。