1. 程式人生 > >java nio 系列教程(1)----buffer介紹和使用方法

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

大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油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);
    }
}