NIO学习(六):Java NIO的Buffer属性(capacity,position,limit,mark)理解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/outsanding/article/details/102657840
背景
  1. Java NIO中提供了7种基础数据类型的Buffer,分别是:ByteBuffer, CharBuffer,ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer,它们都继承抽象类Buffer。
  2. 抽象类Buffer的底层就是装字节的容器(字节数组容器)。
  3. Buffer有3个很重要的属性,capactiy, position,limit。
  4. 当buffer调用flip()方法的时候,其实是重新调整limit的值为position的值,而postion的值赋为0。

过程
  1. 获取Buffer的具体实例

    IntBuffer buffer = IntBuffer.allocate(10);
    

    默认是使用HeapIntBuffer类实例化的:

    new HeapIntBuffer(capacity, capacity);
    
  2. 完整测试代码

public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        System.out.println("------------读数据前---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());
        for (int i = 0; i < buffer.capacity(); i++) {
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }

        System.out.println("------------读数据后---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());

        buffer.flip();

        System.out.println("------------调用flip方法后---------");
        System.out.println("position:" + buffer.position());
        System.out.println("limit: " + buffer.limit());
        System.out.println("capacity: " + buffer.capacity());


        while (buffer.hasRemaining()) {
            System.out.print(buffer.get() + " ");
        }
    }
  1. 结果
    在这里插入图片描述

  2. 图解position和limit值变化过程

    初始化实例后的position和limit值(IntBuffer buffer = IntBuffer.allocate(10))
    在这里插入图片描述
    读入10个数字后

 for (int i = 0; i < buffer.capacity(); i++) {
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }

在这里插入图片描述

调用buffer.flip()方法后
在这里插入图片描述

它执行了两个操作,limit = position; position = 0;

测试它最好的就是不要一开始就把容器填充满了
注意:index:10是一个虚框,它本身是不存在的。


小结
  1. 数学关系:0 <= mark <= positon <= limit <= capacity
  2. mark: 标记着当前position可读或可写的索引值
  3. position:指向下一次可读或者可写的索引值
  4. limit:可读可写的索引一定是小于它的,不能等于它
  5. capacity:数组容量,一旦初始化好了,便永远无法修改

猜你喜欢

转载自blog.csdn.net/outsanding/article/details/102657840