nio之postion,limit,capacity

postion:當前可讀可寫的位置
capacity:緩衝區容量,初始化後,固定不變
limit:緩存區最小不可讀寫的區域的位置,緩衝區域limit索引以後的區域不可讀寫(含limit位置)

先初始化一個IntBuffer

IntBuffer intBuffer = IntBuffer.allocate(10);

初始化完後,limit等於capacity,也就是指向緩衝區末尾的虛線框位置,postion指向緩衝區的第一個位置
在這裏插入圖片描述
接下來插入四個值

intBuffer.put(1);
intBuffer.put(2);
intBuffer.put(3);
intBuffer.put(4);

在這裏插入圖片描述
此時我們從緩衝區讀取一個數據

        System.out.println(intBuffer.get());

在這裏插入圖片描述
執行完後,控制檯打印出0,和我們想象中不太一樣,其實我們是想得到1;在我們調用intBuff.get()方法時,它會返回postion位置的值;其實仔細的同學會發現,執行完get方法後,postion的值會+1操作;如果我們想從最開始的位置讀取數據,如何操作?

intBuffer.flip()

在這裏插入圖片描述
執行完flip()方法後,postion指向了0位置,limit指向了5位置

limit=postion
postion=0

接下來我們讀取兩個值

System.out.println(intBuffer.get());
System.out.println(intBuffer.get());

在這裏插入圖片描述
此時我們再向緩衝區添加一個值

intBuffer.put(5);

在這裏插入圖片描述
此時會將位置2區域的賦值爲5,並且postion+1;接下來在進行一次讀取操作

System.out.println(intBuffer.get());

在這裏插入圖片描述
控制檯打印4,postion=4,接下來再進行一次取值操作
在這裏插入圖片描述
控制檯打印0,此時postion=limit=5;此時無論再進行get和put操作都會拋出如下異常

Exception in thread "main" java.nio.BufferUnderflowException
 at java.nio.Buffer.nextGetIndex(Buffer.java:500)
 at java.nio.HeapIntBuffer.get(HeapIntBuffer.java:135)
 at NioTest1.main(NioTest1.java:30)

如果還想往buffer中寫數據,可以執行flip(),rewind(),clear()這三種方法,flip方法之前已講過;首先來看下rewind(),就是將postion位置置成0
在這裏插入圖片描述
clear()方法,limit=capacity=10,postion=0
在這裏插入圖片描述
從圖中可以看出,無論哪種方法,它都不會改變內存中已有的數據,測試代碼如下

import java.nio.IntBuffer;

public class NioTest11 {

    public static void main(String[] args) {

        IntBuffer intBuffer = IntBuffer.allocate(10);
        print(intBuffer);
        intBuffer.put(1);
        intBuffer.put(2);
        intBuffer.put(3);
        intBuffer.put(4);
        print(intBuffer);
        System.out.println(intBuffer.get());
        print(intBuffer);

        intBuffer.flip();
        print(intBuffer);
        System.out.println(intBuffer.get());
        System.out.println(intBuffer.get());
        print(intBuffer);
        intBuffer.put(5);
        print(intBuffer);
        System.out.println(intBuffer.get());
        print(intBuffer);
        System.out.println(intBuffer.get());
        print(intBuffer);
//        intBuffer.rewind();
//        print(intBuffer);
        intBuffer.clear();
        print(intBuffer);
        System.out.println(intBuffer.get());
        print(intBuffer);


    }

    public static void print(IntBuffer intBuffer){

        System.out.print(intBuffer +"\t");
        int[] array = intBuffer.array();
        for(int i=0;i<array.length;i++){
            System.out.print(array[i] +" \t");
        }
        System.out.println();
    }


}

發佈了117 篇原創文章 · 獲贊 36 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章