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
从图中可以看出,无论哪种方法,它都不会改变内存中已有的数据,测试代码如下
扫描二维码关注公众号,回复:
10045669 查看本文章
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();
}
}