Buffer在java.nio中被定义为抽象类:
属性
Buffer中有4个非常重要的属性:capacity、limit、position、mark
limit属性:代表Buffer可读可写的上限 。 写模式下:limit代表能写入数据的上限位置 , 这个时候limit=capacity读模式下:在Buffer完成所有数据写入后 , 通过调用flip()方法 , 切换到读模式 , 此时limit等于Buffer中实际已经写入的数据大小 。 因为Buffer可能没有被写满 , 所以limit<=capacityposition属性:代表读取或者写入Buffer的位置 。 默认为0 。 写模式下:每往Buffer中写入一个值 , position就会自动加1 , 代表下一次写入的位置 。 读模式下:每往Buffer中读取一个值 , position就自动加1 , 代表下一次读取的位置 。
mark属性:代表标记 , 通过mark()方法 , 记录当前position值 , 将position值赋值给mark , 在后续的写入或读取过程中 , 可以通过reset()方法恢复当前position为mark记录的值 。这几个重要属性讲完 , 我们可以再来回顾下:
0?mark?position?limit?capacity
现在应该很清晰这几个属性的关系了~
Buffer常见操作
创建Buffer
allocate(intcapacity)ByteBufferbuffer=ByteBuffer.allocate(1024);intcount=channel.read(buffer);例子中创建的ByteBuffer是基于堆内存的一个对象 。
wrap(array)wrap方法可以将数组包装成一个Buffer对象:
ByteBufferbuffer=ByteBuffer.wrap("helloworld".getBytes());channel.write(buffer);allocateDirect(intcapacity)通过allocateDirect方法也可以快速实例化一个Buffer对象 , 和allocate很相似 , 这里区别的是allocateDirect创建的是基于堆外内存的对象 。
堆外内存不在JVM堆上 , 不受GC的管理 。 堆外内存进行一些底层系统的IO操作时 , 效率会更高 。
Buffer写操作
Buffer写入可以通过put()和channel.read(buffer)两种方式写入 。
通常我们NIO的读操作的时候 , 都是从Channel中读取数据写入Buffer , 这个对应的是Buffer的写操作 。
Buffer读操作
Buffer读取可以通过get()和channel.write(buffer)两种方式读入 。
还是同上 , 我们对Buffer的读入操作 , 反过来说就是对Channel的写操作 。 读取Buffer中的数据然后写入Channel中 。
rewind():重置position位置为0 , 可以重新读取和写入buffer , 一般该方法适用于读操作 , 可以理解为对buffer的重复读 。 publicfinalBufferrewind(){position=0;mark=-1;returnthis;}flip():很常用的一个方法 , 一般在写模式切换到读模式的时候会经常用到 。 也会将position设置为0 , 然后设置limit等于原来写入的position 。 publicfinalBufferflip(){limit=position;position=0;mark=-1;returnthis;}clear():重置buffer中的数据 , 该方法主要是针对于写模式 , 因为limit设置为了capacity , 读模式下会出问题 。 publicfinalBufferclear(){position=0;limit=capacity;mark=-1;returnthis;}mark()&reset():mark()方法是保存当前position到变量markz中 , 然后通过reset()方法恢复当前position为mark , 实现代码很简单 , 如下:publicfinalBuffermark(){mark=position;returnthis;}publicfinalBufferreset(){intm=mark;if(m<0)thrownewInvalidMarkException();position=m;returnthis;}常用的读写方法可以用一张图总结一下:
推荐阅读
-
-
『青岛』青岛崂山仰口海滨出现蓝眼泪现象 (u002F4)
-
日产逍客|预算15万左右,现代ix35、日产逍客和本田CRV,这三款车选哪一款比较好?
-
娱乐中的趣闻|媒体评分差到离谱,电影改编的游戏速度与激情十字路口
-
-
澎湃新闻|2020高考|四川52万考生进考场,家长不送考反而压力小
-
##领导说的这3句暗语,往往不是字面意思!如果听不懂,越混越惨!
-
必须曝光!娱乐圈顶级大瓜,在黄晓明和吴京“闷声”涿州抗洪上公布
-
【小五分享美食】红烧排骨,健康美味的家常菜,男女老少人都可食用
-
中年|广东民企强?千亿企业一半是国企,多为央企,山东浙江江苏不如
-
跑步|坚持每天跳绳1小时,和跑步同样时间的人比,谁瘦的更快?
-
-
人民日报|我国早稻实现增产 今年总产量达2729万吨同比增3.9%
-
-
生肖|8月发发发,3生肖财富翻番,好运追着跑,事业走上坡,挣足面子
-
像梦一样奔驰|相数云数据建模,数据智能工作者的得力帮手
-
北京日报客户端|美国新冠死亡人数逼近20万,华盛顿钟声响起200次
-
日本|日本暴雨已致70人死亡,27个府县发生山体塌方
-
|“高考最美等待”女生意外走红,一夜涨粉72万,本人表示很慌
-
直播吧|我们要再次找回成就感,勒夫:球队一直缺乏效率