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


}

发布了118 篇原创文章 · 获赞 37 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/woloqun/article/details/103924469
今日推荐