介绍
Buffer是一个缓冲区实质上是一个数组,用于和NIO通道FileChannel进行交互。
在 NIO 中,所有数据都是用 Buffer 缓冲区处理的:
- 读取数据时,读到缓冲区中
- 写入数据时,写入到缓冲区中
即:任何时候访问 NIO 中的数据,都需要将数据放到缓冲区中。
分类
除了boolean外,其余每种基本类型都有一个对应的buffer类:
- ByteBuffer,常用
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
创建缓冲区
ByteBuffer bb=ByteBuffer.allocate(10)
向缓冲区写、读数据(bug)
// 创建
ByteBuffer bb=ByteBuffer.allocate(10);
// 写数据
bb.put("hello".getBytes());
byte[] array=new byte[10];
bb.get(array);//读数据
System.out.println(new String(array));
执行报错,因为在 Buffer 缓冲区中有 3 个重要的属性:
- capacity
- position
- limit
使用不当,会报错
3个重要属性
执行下面代码:
ByteBuffer bb=ByteBuffer.allocate(10);
创建长度是10的byte数组,3个属性如下图:
capacity
Buffer 的 大小,确定后不可改变(相当于数组的长度)
只能写入 capacity 个数据,一旦Buffer满了,需要将其清空(通过读数据或者清除数据),清空后才能继续写数据
position
表示当前的位置,相当于数组索引,初始的 position 值为 0 ,最大值为:capacity – 1
当一个数据写到Buffer后,position 会 移动到下一个可写位置
从写模式切换到读模式,position 会被重置为 0,从Buffer的position处读取数据时,position移动到下一个可读位置
limit
在 写模式 下,Buffer的 limit 表示最多能往Buffer里写多少数据,即:limit等于 capacity
当切换到 读模式 时, limit 表示最多能读到多少数据,即:limit等于写模式下的 position
查看各属性值
ByteBuffer bb=ByteBuffer.allocate(10);
System.out.println("position:"+bb.position());
System.out.println("limit:"+bb.limit());
System.out.println("capacity:"+bb.capacity());
写数据到缓冲区
将数据放入到缓冲区中,然后将 position 移动到下一个可写位置
put()
例子
System.out.println("写数据-------------");
bb.put("hello".getBytes());
System.out.println("position:"+bb.position());
System.out.println("limit:"+bb.limit());
System.out.println("capacity:"+bb.capacity());
切换到读模式
将 limit 的值设置为 position,然后将 position 设置为 0
flip()
例子
System.out.println("切换读模式-------------");
bb.flip();
System.out.println("position:"+bb.position());
System.out.println("limit:"+bb.limit());
System.out.println("capacity:"+bb.capacity());
从缓冲区读取数据
get()
读取数据,然后将 position 移动到下一个可读位置
例子
System.out.println("读取后-------------");
byte[] array=new byte[bb.limit()];
//System.out.println(new String(bb.array()));//不要调用此方法
bb.get(array);
System.out.println(new String(array));
System.out.println("position:"+bb.position());
System.out.println("limit:"+bb.limit());
System.out.println("capacity:"+bb.capacity());
清空缓冲区
clear()
position 设置为0,limit 设置为 capacity,但 不会清除缓冲区中的数据
例子
System.out.println("清空后-------------");
bb.clear();
System.out.println("position:"+bb.position());
System.out.println("limit:"+bb.limit());
System.out.println("capacity:"+bb.capacity());
System.out.println(new String(bb.array()));//还是可以读取到数据



