图解Java NIO Buffer

本文详细解析了Java NIO Buffer的四个基本属性:capacity、limit、position和mark,以及介绍了一系列关键操作,如get、put、flip、rewind、clear、compact、mark和reset。通过示例展示了Buffer在读写过程中的状态变化,帮助读者深入理解Java NIO Buffer的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Buffer四个基本属性

1、capacity:能够容纳的最大元素数目,创建时设定并不能更改
2、limit: buffer中有效位置数目
3、position: 下一个读或者写的位置
4、mark:  用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值

标记、位置、限制和容量值有以下关系: 
0 <= 标记 <= 位置 <= 限制 <= 容量 

Buffer的操作

1、读取

get(),从当前position位置读取
get(index),从index位置读取,不改变当前position
2、写入
put(byte),在当前position位置填充
put(index,byte),按照绝对位置填充不改变当前position属性
3、flip

将limit设为position, 将position设为0。特别注意,flip()方法会改变limit属性,将limit属性从capacity设置为当前position。两次调用buffer的flip方法,将使得position和limit属性都为0。

4、rewind

与flip()类似,但是仅将position设为0,而不改变limit,通常用于重新读取已经被flip的buffer

5、clear

将buffer重设为空状态,也就是设置limit=capacity,position=0,以便重复利用。
6、compact

清除已经读过的数据,任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。即将 position 与 limit之间的数据复制到buffer的开始位置,复制后 position  = limit -position,limit = capacity。
7、mark与reset

mark初始是未定义的,调用mark后,将当前position设为mark以便reset时返回。rewind,clear,flip都将丢弃已经创建的mark调用limit(index),positioon(index),如果index的值小于当前mark,mark也将被丢弃。
8、duplicate与slice

通过duplicate()方法将返回一个新创建的buffer,这个新buffer与原来buffer的视图,一样的capacity,但是有自己的position、limit和mark属性。slice将从原来buffer的当前position开始,并且capacity等于原来Buffer的剩余元素数目,也就是(limit-position)。


下面给出这几个方法的调用时buffer的状态变化

向容量大小为12的buffer中写入helloworld,position发生变化


调用flip,准备读取数据,position和limit发生变化


读取数据的过程中


remaining为0时,说明已经读取完成,此时position和limit重叠。


此时再次调用flip,又可以重新读取


下面clear buffer中的数据,重新写入,此时position为0,limit为capacity


写入字符串javanio


此时可以调用flip读取数据


读取数据


此时可以通过rewind将position置为0,重新从头读取


当读到v的时候,mark一下(此时mark=position),下次可以reset之后重新回到mark的位置


继续读取


此时reset,可以重新回到原先mark的位置


调用compact,将未读的数据拷贝到buffer开始处,然后将position设到最后一个未读元素正后面,limit设置成capacity


这为buffer中的某一情形,下面调用duplicate或者slice,会产生一个buffer的副本。下图为原始的buffer。


调用duplicate,复制出来的buffer其实是一个视图,复制出来的buffer和原来的buffer拥有相同的数据,但是每个buffer都有各自的属性。下图为duplicate buffer。

调用slice,取缓冲区的一部分



以上演示的图片来源于Ron Hitchens撰写的Java Nio这本书的网站。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值