NIO与Socket笔记 : 转换为 CharBuffer字符缓冲区及中文的处理

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 

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/88891355
今日推荐