java8 NIO 之緩衝區Buffer

    import java.nio.ByteBuffer;


    import org.junit.Test;


    public class Nio01 {
    /*
    * 一、緩衝區(Buffer):在 Java NIO 中負責數據的存取。緩衝區就是數組。用於存儲不同數據類型的數據
    * 
    * 根據數據類型不同(boolean 除外),提供了相應類型的緩衝區:
    * ByteBuffer
    * CharBuffer
    * ShortBuffer
    * IntBuffer
    * LongBuffer
    * FloatBuffer
    * DoubleBuffer
    * 
    * 上述緩衝區的管理方式幾乎一致,通過 allocate() 獲取緩衝區
    * 
    * 二、緩衝區存取數據的兩個核心方法:
    * put() : 存入數據到緩衝區中
    * get() : 獲取緩衝區中的數據
    * 
    * 三、緩衝區中的四個核心屬性:
    * capacity : 容量,表示緩衝區中最大存儲數據的容量。一旦聲明不能改變。
    * limit : 界限,表示緩衝區中可以操作數據的大小。(limit 後數據不能進行讀寫)
    * position : 位置,表示緩衝區中正在操作數據的位置。
    * 
    * mark : 標記,表示記錄當前 position 的位置。可以通過 reset() 恢復到 mark 的位置
    * 
    * 0 <= mark <= position <= limit <= capacity
    * 
    * 四、直接緩衝區與非直接緩衝區:
    * 非直接緩衝區:通過 allocate() 方法分配緩衝區,將緩衝區建立在 JVM 的內存中
    * 直接緩衝區:通過 allocateDirect() 方法分配直接緩衝區,將緩衝區建立在物理內存中。可以提高效率
    */
    @Test
    public void test03(){
    //創建直接緩衝區
    ByteBuffer bff=ByteBuffer.allocateDirect(1024);
    System.out.println(bff.position());
    }

    @Test
    public void test02(){
    String str="sdsaffffffffffffff";
    //非直接緩衝區
    ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
    byteBuffer.put(str.getBytes());
    byteBuffer.flip();
    byte[] ba=new byte[byteBuffer.limit()];
    byteBuffer.get(ba,0,2);
    System.out.println(new String(ba, 0, 2));

    //標記
    byteBuffer.mark();
    byteBuffer.get(ba,2,4);
    System.out.println(new String(ba, 2, 4));
    //恢復 到mark的位置
    byteBuffer.reset();
    System.out.println(byteBuffer.position());
    }
    @Test
    public void test01(){
    String str="ds1.///[}/?s45465ss436suyj/l;ss765sss2312sssdasfdsgfdhfhtryh34t64weg";
    //分配緩衝區大小 直接緩衝區
    ByteBuffer buf=ByteBuffer.allocate(1024);
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //數據放置到緩存區
    buf.put(str.getBytes());
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());


    //切換讀取數據的模式
    buf.flip();
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //讀取數據
    byte[] bat=new byte[buf.limit()];
    buf.get(bat);
    System.out.println(new String(bat,0,bat.length));
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

    //可重複讀取
    buf.rewind();
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());

        //清空緩衝區 但是緩衝區中的數據依然存在,但是處於“被遺忘”狀態
    buf.clear();
    System.out.println(buf.position());
    System.out.println(buf.limit());
    System.out.println(buf.capacity());
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章