一、ByteBuffer的创建
ByteBuffer创建缓存区常用的有两种方式:
1、使用allocate直接创建指定大小的空缓存区
ByteBuffer buffer=ByteBuffer.allocate(64);
position: 0 limit: 64 capacity 64
2、使用wrap创建一个具有内容的缓存区
ByteBuffer b2=ByteBuffer.wrap("12345678".getBytes());
position: 0 limit: 8 capacity 8
二、将数据存放如缓存区
ByteBuffer存放数据方法为put(),存放数据position会进行递增操作,position最大为capacity。超出大小将抛出异常
三、从缓存区读取数据
get(),读取内容为position与limit之间的内容,每次读取position将回进行递增操作。超出大小将抛出异常
注意:
clear:
清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记
此方法不能实际清除缓冲区中的数据,但从名称来看它似乎能够这样做,这样命名是因为它多数情况下确实是在清除数据时使用
使用clear方法只是将buffer的几个标识位重置,并没有将缓存中的数据清除,在使用中千万注意
flip:
首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记
flip方法是将position位置设定为limit位置,将position设置为0
remaining:
返回当前位置与限制之间的元素数
compact:
将缓冲区的当前位置和界限之间的字节(如果有)复制到缓冲区的开始处。即将索引 p = position() 处的字节复制到索引 0 处,将索引 p + 1 处的字节复制到索引 1 处,依此类推,直到将索引 limit() - 1 处的字节复制到索引 n = limit() - 1 - p 处。然后将缓冲区的位置设置为 n+1,并将其界限设置为其容量。如果已定义了标记,则丢弃它
compact方法就是将position与limit之间的数据移动到0到limit() - 1 - p处,将position设置为后面可用位置,limit设置为初始大小
将缓冲区的位置设置为复制的字节数,而不是零,以便调用此方法后可以紧接着调用另一个相对 put 方法。
从缓冲区写入数据之后调用此方法,以防写入不完整。例如,以下循环语句通过 buf 缓冲区将字节从一个信道复制到另一个信道:
buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }