背景
- 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:数组容量,一旦初始化好了,便永远无法修改
版权声明:本文为outsanding原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。