ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Buffer flip()方法用法

2021-10-19 13:00:47  阅读:254  来源: 互联网

标签:capacity Buffer flip 用法 buffer limit position


Buffer既可以用来读和写。如下:

public class NioTest {
    public static void main(String[] args) {
        // 分配内存大小为10的缓存区
        IntBuffer buffer = IntBuffer.allocate(10);
        // 往buffer里写入数据
        for (int i = 0; i < 5; ++i) {
            int randomNumber = new SecureRandom().nextInt(20);
            buffer.put(randomNumber);
        }
        // 将Buffer从写模式切换到读模式(必须调用这个方法)
        buffer.flip();
        // 读取buffer里的数据
        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
    }
}


这里有个关键的方法flip(),buffer读写转换全靠它来实现。看看这个方法做了什么,进入jdk源码,如下:

   public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }


这里涉及的到Buffer的几个重要属性:position,limit,mark。所以,我们先得把这几个属性搞明白。

capacity,limit,position三个重要属性的含义
Buffer是特定基本类型元素的线性有限序列。除内容外,Buffer区的基本属性还包括capacity(容量)、limit(限制)和position(位置):

capacity是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。
limit是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。
position是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。

三个属性的关系与图解
拿第一个例子来分析,这三个属性的作用。

1.分配内存大小为10的缓存区。索引10的空间是我虚设出来,实际不存在,为了能明显表示capacity。IntBuffer的容量为10,所以capacity为10,在这里指向索引为10的空间。Buffer初始化的时候,limit和capacity指向同一索引。position指向0。

这里写图片描述

2.往Buffer里加一个数据。position位置移动,capacity不变,limit不变。

这里写图片描述

3.Buffer读完之后,往bufer里写了5个数据,position指向索引为5的第6个数据,capacity不变,limit不变。

这里写图片描述

4.执行flip()。这时候对照着,之前flip源码去看。把position的值赋给limit,所以limit=5,然后position=0。capacity不变。结果就是:

这里写图片描述

 
5.Buffer开始往外写数据。每写一个,position就下移一个位置,一直移到limit的位置,结束。

这里写图片描述

上图的顺序就是代码中的IntBuffer从初始化,到读数据,再写数据三个状态下,capacity,position,limit三个属性的变化和关系。
大家可以发现:
1. 0 <= position <= limit <= capacity
2. capacity始终不变

图中很好的阐述了,Buffer读写切换的过程。即flip()的反转原理。接下来我们从代码中检测上面的分析过程。想一下下面代码打印的内容,然后执行一编代码看看对不对。

public class NioTest {
    public static void main(String[] args) {
        // 分配内存大小为10的缓存区
        IntBuffer buffer = IntBuffer.allocate(10);

        System.out.println("capacity:" + buffer.capacity());

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

        System.out.println("before flip limit:" + buffer.limit());

        buffer.flip();

        System.out.println("after flip limit:" + buffer.limit());

        System.out.println("enter while loop");

        while (buffer.hasRemaining()) {
            System.out.println("position:" + buffer.position());
            System.out.println("limit:" + buffer.limit());
            System.out.println("capacity:" + buffer.capacity());
            System.out.println("元素:" + buffer.get());
        }
    }
}


 

标签:capacity,Buffer,flip,用法,buffer,limit,position
来源: https://blog.csdn.net/yuxin6866/article/details/120843912

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有