java buffer nio_java NIO-API Buffer

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)

7d5f550129776455cc0dac075778cd90.png

往buffer中写数据

byteBuffer.wrap("Hello".getBytes());后结构如下:

dbd6d227dd3bd280a674583cac6e8c6d.png

需要从buffer中读数据时就需要调整buffer的position和limit属性,调用flip方法后结构如下

8dfc4c75117a25b7445f29504b2f5f3a.png

每当对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的正确位置开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值