JAVA-NIO-ByteBuffer

bytebuffer

属性

  • position:下一次读取或写入的位置。
  • limit:指定还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)。
  • capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。
  • mark:标记位配置mark和reset方法

初始化方法

  • allocateDirect:堆外内存
  • allocate:堆内内存

几个重要的方法介绍

compact-压缩缓冲区,将未读的数据放在缓冲区头部

将position到limit的数据复制到0到limit-postion中,同时position等于limit-postion,limit等于capacity。一般用于继续写。

例如:postion=1,limit=10,capacity=10,经过compact后,position=9,limit=10,capacity=10

clear

position为0,limit=capacity,一般在写之前调用,buffer可以从头开始写。

flip

limit变为当前的position,用于读取,一般在读取buffer之前调用,可以返回0-limit之间的数据。

rewind

读写都可以用,只是将position置为0,mark置为-1。表示可以重新读写。

mark和reset

mark:指定一个特定的position一个标记位
reset:在mark指定的标记位开始进行操作

slice

slice() 方法根据现有的缓冲区创建一个子缓冲区,俩者共享数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ByteBuffer orgBuffer = ByteBuffer.allocateDirect(1024);
orgBuffer.put("liuhao".getBytes());
orgBuffer.flip();

ByteBuffer newBuffer = orgBuffer.slice();
System.out.println("newBuffer init slice =" + newBuffer);

System.out.println("============");
byte[] stringNew = new byte[newBuffer.limit()];
newBuffer.get(stringNew);
System.out.println("read new buffer " + new String(stringNew));//和orgBuffer读出来的一致

//对newBuffer做了修改,影响了orgBuffer
newBuffer.clear();
newBuffer.put("lzh".getBytes());
byte[] stringOrg = new byte[orgBuffer.limit()];
orgBuffer.get(stringOrg);
System.out.println("read org buffer " + new String(stringOrg));