asCharBuffer()方法的作用:创建此字节缓冲区的视图 ,作为 char缓冲区。 新缓冲区的 内容将从此缓冲区的当前位置开始。 此缓冲区内容的更改在新缓冲区中是可见的 ,反之亦 然 ;这两个缓冲区的位置、 限制和标记值是相互独立的。 新缓冲区的位置将为 0,其容量和 限制将为此缓冲区中所剩余的字节数的 1/2,其标记是不确定的。 当且仅当此缓冲区为直接 缓冲区时,新缓冲区才是直接缓冲区。 当且仅当此缓冲区为只读时, 新缓冲区才是只读的.
package com.zl.nio;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
public class BufferTest05 {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] byte1 = "我是一个优秀的人".getBytes("UTF-16be");
System.out.println(Charset.defaultCharset().name());
ByteBuffer bytebuffer = ByteBuffer.wrap(byte1) ;
System.out.println("bytebuffer=" + bytebuffer.getClass() .getName());
CharBuffer charBuffer = bytebuffer.asCharBuffer() ;
System.out.println("charBuffer=" + charBuffer.getClass() .getName());
System. out. println( "bytebuffer .position="+ bytebuffer.position()+" bytebuffer.capacity="
+ bytebuffer.capacity() + " bytebuffer.limit=" + bytebuffer. limit()) ;
System.out.println("charBuffer.position=" + charBuffer.position() + "charBuffer.capacity"
+ charBuffer.capacity() + " charBuffer.limit=" + charBuffer. limit ()) ;
System. out. println(charBuffer.capacity());
charBuffer.position(0);
for (int i = 0 ;i< charBuffer.capacity ();i++) {
System.out.print(charBuffer.get() + "" );
}
}
}
或者:
package com.zl.nio;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
public class BufferTest05 {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] byte1 = "我是一个优秀的人".getBytes("UTF-8");
System.out.println(Charset.defaultCharset().name());
ByteBuffer bytebuffer = ByteBuffer.wrap(byte1) ;
System.out.println("bytebuffer=" + bytebuffer.getClass() .getName());
CharBuffer charBuffer = Charset.forName("UTF-8").decode(bytebuffer);
System.out.println("charBuffer=" + charBuffer.getClass() .getName());
System. out. println( "bytebuffer .position="+ bytebuffer.position()+" bytebuffer.capacity="
+ bytebuffer.capacity() + " bytebuffer.limit=" + bytebuffer. limit()) ;
System.out.println("charBuffer.position=" + charBuffer.position() + "charBuffer.capacity"
+ charBuffer.capacity() + " charBuffer.limit=" + charBuffer. limit ()) ;
System. out. println(charBuffer.capacity());
charBuffer.position(0);
for (int i = 0 ;i < charBuffer.limit (); i++) {
System.out.print(charBuffer.get() + " " );
}
}
}
这两个方式是存在区别的
CharBuffer charBuffer = Charset.forName("UTF-8").decode(bytebuffer);
这个不会改变capacity 大小, 只会改变limit
CharBuffer charBuffer =bytebuffer.asCharBuffer();
既会改变capacity 大小,又会改变limit