2017-04-14 42 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()