java nio 系列教程(1)----buffer介绍和使用方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/84987990

大家推荐个靠谱的公众号程序员探索之路,大家一起加油https://img-blog.csdnimg.cn/20181129224604602.png ​  

package com.zzh.buffer;

import org.junit.jupiter.api.Test;

import java.nio.ByteBuffer;

/**
 * 一.缓冲区(buffer):在java nio中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据
 * 根据数据类型不同(boolean除外),提供了相应类型的缓冲区:
 *ByteBuffer
 * CharBuffer
 * ShortBuffer
 * IntBuffer
 * LongBuffer
 * FloatBuffer
 * DoubleBuffer
 * 上述缓冲区的管理方式几乎一致,通过allocate()获取缓冲区
 *
 * 二 缓冲区中的四个核心方法:
 * put() : 存入数据到缓冲区中
 * get():  获取缓冲区中的数据
 * flip():切换到读数据模式
 * rewind():重新读(注意和flip的区别)
 * clear():清空,缓冲区中的数据依然存在,但是处于"被遗忘状态"
 *
 * 三.缓冲区的四个核心属性:
 *  private int mark = -1; //标记,表示记录当前postion的位置,可以通过reset()恢复到mark的位置
    private int position = 0;//当前位置
    private int limit;//可读取的最大位置
    private int capacity;//容量,表示缓冲区中最大存储数据的容量.一旦声明
 *四,直接缓冲区与非直接缓冲区
 * 非直接缓冲区:通过allocate方法分配缓冲区,将缓冲区建立在JVM的内存中
 * 直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中,某些环境下可以直接提高效率
 */
public class TestBuffer {


    public static void main(String[] args) {
        String name = "zzh";
        //1.分配一个容量为1024的缓存区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println("分配容量之后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        //2.存入数据
        byteBuffer.put(name.getBytes());
        System.out.println("存入数据之后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        /**
         * 3.切换到读取数据模式
         * 作用
         *  limit = position; 可访问的位置=position
            position = 0; 将postion 置为0
            mark = -1;
         */
        byteBuffer.flip();
        System.out.println("切换到读取数据模式后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        /**
         * 4.读取数据
         */
        byte[] bytes = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes);
        System.out.println(new String(bytes, 0, bytes.length));
        System.out.println("读取数据后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        /**
         * 5.rewind  注意和flip的区别
         * 作用
         *  position = 0;
             mark = -1;
         */
        byteBuffer.rewind();
        System.out.println("rewind后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        /**
         * clear(),清空缓冲区,只是四个核心属性被初始化,缓冲区中的数据依然存在,但是处于"被遗忘状态"
         */
        byteBuffer.clear();
        System.out.println("清空缓冲区后的缓冲区--------------");
        System.out.println("position->"+byteBuffer.position());
        System.out.println("limit->"+byteBuffer.limit());
        System.out.println("capacity->"+byteBuffer.capacity());

        /**
         * mark()标记一下 postion的位置
         */
        byteBuffer.mark();
        /**
         * reset()恢复到mark标记的位置
         */
        byteBuffer.reset();
        /**
         * hasRemaining缓冲区中是否有数据
         */
        byteBuffer.hasRemaining();
        /**
         * 缓冲区中剩余多少数据
         */
        int remaining = byteBuffer.remaining();
    }

    @Test
    public void bufferDirect(){
        //直接缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
    }
}

猜你喜欢

转载自blog.csdn.net/yueloveme/article/details/84987990