版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
背景
- Java NIO中提供了7种基础数据类型的Buffer,分别是:ByteBuffer, CharBuffer,ShortBuffer, LongBuffer, FloatBuffer, DoubleBuffer,它们都继承抽象类Buffer。
- 抽象类Buffer的底层就是装字节的容器(字节数组容器)。
- Buffer有3个很重要的属性,capactiy, position,limit。
- 当buffer调用flip()方法的时候,其实是重新调整limit的值为position的值,而postion的值赋为0。
过程
-
获取Buffer的具体实例。
IntBuffer buffer = IntBuffer.allocate(10);
默认是使用HeapIntBuffer类实例化的:
new HeapIntBuffer(capacity, capacity);
-
完整测试代码
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() + " ");
}
}
-
结果
-
图解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是一个虚框,它本身是不存在的。
小结
- 数学关系:0 <= mark <= positon <= limit <= capacity
- mark: 标记着当前position可读或可写的索引值
- position:指向下一次可读或者可写的索引值
- limit:可读可写的索引一定是小于它的,不能等于它
- capacity:数组容量,一旦初始化好了,便永远无法修改