源码
flip 反转缓冲区? 看的一脸懵逼
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
怎么理解capacity、limit、position
- capacity是它所包含的元素的数量。缓冲区的容量不能为负并且不能更改。
- limit是第一个不应该读取或写入的元素的索引。缓冲区的限制不能为负,并且不能大于其容量。
- position是下一个要读取或写入的元素的索引。缓冲区的位置不能为负,并且不能大于其限制。
- 分配内存大小为10的缓存区。索引10的空间是我虚设出来,实际不存在,为了能明显表示capacity。IntBuffer的容量为10,所以capacity为10,在这里指向索引为10的空间。Buffer初始化的时候,limit和capacity指向同一索引。position指向0。
- 往Buffer里加一个数据。position位置移动,capacity不变,limit不变。
- Buffer读完之后,往bufer里写了5个数据,position指向索引为5的第6个数据,capacity不变,limit不变。
- 执行flip()。这时候对照着,之前flip源码去看。把position的值赋给limit,所以limit=5,然后position=0。capacity不变。结果就是:
- 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