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();
}
}