簡體   English   中英

ByteArrayOutputStream到CharBuffer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM