2017-04-14 43 views
0

我想將字節讀入直接ByteBuffer,然後解碼它們而不將原始緩衝區重新包裝到byte []數組中以最大限度地減少內存分配。因此我想避免使用StandardCharsets.UTF_8.decode(),因爲它在堆上分配新的數組。Java直接字節緩衝區 - 解碼字符

我被困在如何解碼字節。考慮下面的代碼,它將一個字符串寫入緩衝區,然後再次讀取id。

代碼輸出:

䡥汬漠 

我怎樣才能解碼緩衝器?

+2

您需要翻轉'CharBuffer',而不是'ByteBuffer'。'CharBuffer'不會繼承翻轉狀態。 – EJP

回答

1

您無法指定CharBuffer的編碼。在這裏看到:What Charset does ByteBuffer.asCharBuffer() use?

而且,由於緩衝區是可變的,我看不出你如何能永遠不可能創建它String它總是沒有做內存重新分配不變...

+0

謝謝約翰,但我的問題仍然存在。如何解碼直接ByteBuffer中的字符而無需額外的內存分配? –

+0

你的問題是'我如何指定直接CharBuffer上的編碼?'雖然... – john16384

+0

恕我直言,這應該是一個評論,或重複的近距離投票,而不是一個安撫。 – glee8e

1

我想將字節讀入直接的ByteBuffer,然後對它們進行解碼,而不用將原始緩衝區重新包裝到byte []數組中,以儘量減少內存分配。

ByteBuffer.asCharBuffer()確實符合您的需求,因爲兩個包裝共享相同的基礎緩衝區。

這種方法的javadoc說:

新緩衝區的位置將爲零,其容量和界限將是由兩個

分爲遺留在這個緩衝區的字節數。雖然它不是明確地說,這暗示CharBuffer在給定的緩衝區上使用UTF-16字符編碼。由於我們無法控制charbuffer使用的編碼,所以您沒有多少選擇,只能在該編碼中編寫字符字節。

byteBuffer.put("Hello Dávid".getBytes(StandardCharsets.UTF_16)); 

一件事您的打印for循環。請注意,CharBuffer.length()實際上是緩衝區位置和限制之間的剩餘字符數,因此在您撥打CharBuffer.get()時會減少。因此,您應該使用get(int)或將for終止條件更改爲limit()