NIO边看边记 之 Buffer(三)

12 篇文章 0 订阅

缓冲区Buffer其实就是一块内存区域。用于和channel来进行数据交互。从channel中读取数据到buffer,将buffer中的数据写到channel中。这块内存区域在java NIO中被封装成Buffer对象。

Buffer的基本用法

使用buffer进行读写数据一般会经过如下4个步骤:
(1)从channel中读取数据写到buffer中
(2)调用buffer的flip()方法切换buffer的读写模式
(3)从buffer中读取数据写到channel中
(4)调用clear()方法或者compact()方法,清空buffer。
其中:
a.当往buffer中写数据时会记录写入的数量
b.写完buffer,需要调用flip()方法将buffer从写模式切换到读模式
c.读完buffer,需要调用clear()或者compact()方法使buffer做好写的准备
d.clear方法与compact()方法的区别:
clear方法会清空所有buffer中的内容;compact方法只清空从buffer中读出的内容,当再次写入时,剩下的未读出的内容被挪到buffer的开头,新写入的将放到缓冲区未读数据的后面。

Buffer的capacity、position、limit

capacity的概念在Buffer的读写模式下是一样的,position和limit的概念需要区分Buffer的读写模式。
请看下图:
这里写图片描述
(1)capacity
Buffer作为一块内存区域在java层面的抽象,它的大小被称之为capacity。用来衡量最大存放数据量的大小。当写满capacity大小的数据量时需要清空或者读取操作之后才能继续写。
(2)position
写:position用来表示写入的位置。初始时,position的位置为0(不一定是0,如果调用的compact方法则被移动到未读数据的下一个位置)。当一个byte、int、long写入到buffer之后,position往前移动一个位置。跟数组的小标差不多。position的位置最大为capacity-1。注意,每次写buffer时不一定会写满buffer。
读:当buffer被切换到读模式时,position被移动到位置0。每读取一个数据,position往前移动一个位置。
(3)limit
写:表示你最多能往buffer中写多少数据。此时limit=capacity
读:表示你最多能从buffer中读多少数据。当buffer被切换到读模式时,写完时的position的值被赋值给limit。也就是说,你可以读取到所有buffer中写入的数据。也就是说,读buffer时读取的是position和limit之间的值。

一些方法

(1)flip()
当调用flip()方法时就会将position移到位置0,limit置为写buffer时的position。
(2)rewind()
在读取时,rewind()方法只是将position方法置0,limit不变,因此可以重新读取buffer中的内容。
(3)clear()与compact()
当读完buffer中的内容,需要调用clear()和compact()方法来讲buffer切换到写模式。
clear()方法会“清除”buffer中的内容,将position置为0,limit置为capacity。其实并没有清除buffer中的内容只是用新数据覆盖了旧数据。
compact()方法只是清除读出来的数据区域。首先将未读完的数据复制到buffer的起始位置处,然后将position置为未读完数据的下一个位置,limit置为capacity的值。这时再写buffer时不会覆盖未读的数据。
(4)mark()与reset()
mark()可以记录当前position的位置,使用reset将position置为刚才mark()记录的位置。
(5)equals()
当满足以下条件时表示两个buffer相等
a.两个buffer中存放的数据类型相同
b.position和limit之间的元素个数相同
c.position和limit之间的元素都相同
(6)compareTo()
当满足以下条件时认为一个buffer“小于”另一个buffer
a.第一个不相等的元素小于另一个buffer中对应的元素
b.所有的元素都相等,但是第一个buffer中的元素个数小于另一个buffer的元素个数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值