我想將字節讀入直接ByteBuffer,然後解碼它們而不將原始緩衝區重新包裝到byte []數組中以最大限度地減少內存分配。因此我想避免使用StandardCharsets.UTF_8.decode()
,因爲它在堆上分配新的數組。Java直接字節緩衝區 - 解碼字符
我被困在如何解碼字節。考慮下面的代碼,它將一個字符串寫入緩衝區,然後再次讀取id。
代碼輸出:
䡥汬漠
我怎樣才能解碼緩衝器?
我想將字節讀入直接ByteBuffer,然後解碼它們而不將原始緩衝區重新包裝到byte []數組中以最大限度地減少內存分配。因此我想避免使用StandardCharsets.UTF_8.decode()
,因爲它在堆上分配新的數組。Java直接字節緩衝區 - 解碼字符
我被困在如何解碼字節。考慮下面的代碼,它將一個字符串寫入緩衝區,然後再次讀取id。
代碼輸出:
䡥汬漠
我怎樣才能解碼緩衝器?
您無法指定CharBuffer
的編碼。在這裏看到:What Charset does ByteBuffer.asCharBuffer() use?
而且,由於緩衝區是可變的,我看不出你如何能永遠不可能創建它String
它總是沒有做內存重新分配不變...
我想將字節讀入直接的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()
。
您需要翻轉'CharBuffer',而不是'ByteBuffer'。'CharBuffer'不會繼承翻轉狀態。 – EJP