我想将字节读入直接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