Java NIO学习之Buffer的flip()

源码

flip 反转缓冲区? 看的一脸懵逼

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

怎么理解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的位置,结束。
    在这里插入图片描述

现象
0 <= position <= limit <= capacity
capacity始终不变

代码验证

package IODemos;

import java.nio.IntBuffer;
import java.security.SecureRandom;
import java.util.Random;

/**
 * @author lzx
 * @date 2023/3/27 10:01
 * @description: TODO 验证 flip()
 */
public class NioTest {
    // private static final int BUFFER_SIZE = 1024;

    public static void main(String[] args) {
        IntBuffer buffer = IntBuffer.allocate(10);
        System.out.println("capacity: "+ buffer.capacity());

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

        System.out.println("before flip limit: " + buffer.limit());
        System.out.println("before flip position: " + buffer.position());
        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: 10
	before flip limit: 10
	before flip position: 5
	after flip limit: 5
	enter while loop
	position 0
	limit: 5
	capacity:10
	元素:18
	position 1
	limit: 5
	capacity:10
	元素:9
	position 2
	limit: 5
	capacity:10
	元素:1
	position 3
	limit: 5
	capacity:10
	元素:8
	position 4
	limit: 5
	capacity:10
	元素:12

参考

https://blog.csdn.net/u013096088/article/details/78638245

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值