Buffer本质上就是对数组包装了的一个类,定义了一些方法和属性,来对记录数组中数据的读写状态和对数组进行相应的操作。
常用属性:
position:
Buffer可操作的第一个位置。在往Buffer中写数据时会从Buffer数组中的position位置开始写。从Buffer中读数据时会从Buffer的position开始读。
limit:
Buffer最多可操作的数据的位置。在往Buffer中写数据时表示最多可写到数据量为limit。从Buffer中读数据时需要开启Buffer的读模式,读从position到limit位置的数据(一般是调用flip方法使limit=position;poslition=0)。
capcity:
Buffer数组的容量。
mark:
备忘位置,调用mark()使得mark=position,调用reset(),恢复postion使position=mark。
用ByteBuffer举例
ByteBuffer byteBuffer=ByteBuffer.allocate(10)
往buffer中写数据
byteBuffer.wrap("Hello".getBytes());后结构如下:
需要从buffer中读数据时就需要调整buffer的position和limit属性,调用flip方法后结构如下
每当对buffer进行读写操作后buffer的position属性会随着读写数据的增多而后移,compact方法会使所有未读元素移到buffer初始位置,position移到最后一个未读元素的下一个位置,limit等于capcity。
结合例子,在服务端57行intcount = client.read(rcvBuffer);我们把从客户端读到的数据读到了rcvBuffer中,在73行调用了flip()方法,这是将rcvBuffer的position设为0,limit设置为读到的数据量,这样在78行往客户端写数据的时候才能保证是从buffer的开头进行写的。
78行调用了compact方法,这是因为调用write方法时是不能保证将buffer中的全部数据都发送到客户端的,因此我们通过buffer.hasRemaing()方法判断是不是写操作已经将buffer中的数据全部写完,如果全部写完了才注册读事件,否则直到将buffer中的数据全部写完。最后调用compact方法,使下一次读或写能从rcvBuffer的正确位置开始。