java nio Buffer

介绍

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()));//还是可以读取到数据

原文出处:/show_1IX1b4gRWX0Y.html