Charset做的ByteBuffer.asCharBuffer()使用什么?

Charset做的ByteBuffer.asCharBuffer()使用什么? 它似乎在我的系统上将3个字节转换为一个字符。

在相关的说明中, CharsetDecoder如何与ByteBuffer.asCharBuffer()相关联?

更新 :关于我正在使用的ByteBuffer的实现,我正在调用ByteBuffer.allocate(1024).asCharBuffer() 。 我不能评论在幕后使用什么实现。

对于第一个问题 – 我相信它使用Java的原生字符编码(UTF-16)。

据我了解,它没有使用任何东西。 它只是假设它已经被正确解码为Java的字符串,这意味着UTF-16。 这可以通过查看HeapByteBuffer的源来显示,其中返回的charbuffer最终调用(little endian version):

 static private char makeChar(byte b1, byte b0) { return (char)((b1 << 8) | (b0 & 0xff)); } 

因此,这里唯一要处理的是你负责的其余部分的字节顺序。 这也意味着使用Decoder类通常更有用,您可以在其中指定编码。

看看jdk7, jdk/src/share/classes/java/nio

  1. X-Buffer.java.templateByteBuffer.allocate()映射到Heap-X-Buffer.java.template
  2. Heap-X-Buffer.java.templateByteBuffer.asCharBuffer()映射到ByteBufferAs-X-Buffer.java.template
  3. ByteBuffer.asCharBuffer().toString()调用CharBuffer.put(CharBuffer)但我无法弄清楚这导致

最终这可能导致Bits.makeChar()定义为:

 static private char makeChar(byte b1, byte b0) { return (char)((b1 << 8) | (b0 & 0xff)); } 

但我无法弄清楚如何。