[英]ByteArrayOutputStream to CharBuffer
我有一個輸入ByteArrayOutputStream,需要將其轉換為CharBuffer。
我試圖避免創建新的字符串。 反正有做到這一點。
我正在嘗試執行以下操作,但是我沒有字符串的編碼,因此下面的代碼將不起作用(無效的輸出)。
ByteBuffer byteBuffer = ByteBuffer.wrap(byteOutputStream.toByteArray());
CharBuffer document = byteBuffer.asCharBuffer();
您必須提供編碼。 班級應該如何知道如何轉換。 您無法在寫入ByteOutputStream或完全避免流之前確定編碼。 如果不是,您必須做一些假設,可能會失敗
提供一種編碼,您可以將字節緩沖區轉換為char緩沖區
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharBuffer charBuffer = decoder.decode(yourByteBuffer);
ByteBuffer.asCharBuffer
給您一個非常字面的兩個byte
s到char
(大或小尾數),更新反映在兩個緩沖區中。
大概您想通過某種合理的編碼將byte
s轉換為char
。 有很多方法可以做到這一點。 例如[new String(byte [],字符串編碼)] [1]。 通常,它們將以某種形式通過CharsetEncoder 。 然后從那里獲取CharBuffer
應該很簡單。
CharBuffer
是一種很底層的東西。 您確定這確實是您想要的嗎?
[1]: http:// file:/// C:/Users/tackline/sun/docs/api/java/lang/String.html#String(byte [] ,java.lang.String)
ByteBuffer.asCharBuffer()
假定字節為UTF-16。 (我在文檔中找不到明確說明這一點的任何東西,但是實現只將成對的字節視為char的低字節和高字節。)如果需要其他編碼,則必須使用其他方法。
最簡單的方法是只創建一個String
:
CharBuffer document = CharBuffer.wrap(byteOutputStream.toString(encoding));
我知道您說過您“正在嘗試避免創建新的字符串”,但是您的代碼段還是在分配一個單獨的字節數組( ByteArrayOutputStream.toByteArray()
“根據文檔創建了一個新分配的字節數組”)。 因為CharBuffer
支持隨機訪問,並且許多編碼(尤其是UTF-8)都是可變寬度的,所以最好還是將整個內容轉換為chars。
如果您真的只想對字符進行流式訪問(而不是隨機訪問),那么CharBuffer
可能不是底層代碼可以接受的最佳接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.