Java NIO - Buffer 基础 -1

本文深入探讨Java NIO技术,包括非阻塞I/O、Buffer传输机制及其应用,详细解释如何创建和使用Buffer,以及关键变量如mark、position、limit和capacity的作用。

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

java nio使用了操作系统层对对非阻塞io的支持。不再是基于stream的数据传输,而是基于buffer的数据传输。nio最大的改变有:非阻塞io,可以减少线程数量;buffer传输数据机制,这个应该是为了迎合底层实现,提高效率;同样也是因为使用了底层直接的io api,所以io的效率也提高了。

buffer作为数据的载体,java nio中为每种基本数据类型(boolean除外)都提供了一种buffer实现。使用最多的还是bytebuffer。下面的buffer即可能指代buffer,也可能指代bytebuffer。

buffer的创建有几种方式,可以把一个byte数组包装成一个buffer;可以直接new一个buffer,指定buffer的capacity;也可以调用allocate方法,创建一个direct buffer。

无论通过何种方式创建出来的buffer,在实际使用的时候都可以看作一样的。

buffer有几个变量时不得不谈的: 0<=mark<=position<=limit<=capacity。

mark的值是用来暂时保存position值的,这个在buffer的某些方法中会用到。

position是指向下一个将要被读出的元素或者写入下一个元素的位置。

limit是最后一个有效元素的位置。只对读数据有效。

capacity是buffer的最大容量,写操作的时候不能超过此索引值。buffer一旦创建,这个值就不再可以更改。

buffer的读写操作,都是操作数组上的值和这几个变量。

首先说写操作。

在写操作之前,如果确定buffer中的数据已经没用了,可以调用clear方法先。这个方法会将mark变量设为-1,position为0,limit为capacity。可以看出,这是清空了buffer,做好了写入数据的准备。

写入数据是通过put方法,可以每次put一个元素,也可以每次put一个数组。put一个数组的参数是(arr, offsite, len)。这个很直接,没啥好说的。

每次调用put方法之后,position变量都会增加put进去元素的个数。也就是说,position变量始终是指向下一个空白的位置,等待新的元素写入。如果在position到达capacity后还尝试放入元素,则会抛出bufferoverflowexception。

然后是读取操作。

当写入完毕后,下一步就应该是对buffer进行读取操作了。在读取之前,必须调用flip方法完成读写的转换。

调用flip后,limit=position, position=0,mark=-1;可以看到,这已经为读取做好了准备:程序可以从position开始读。读取使用get方法,每次读取一个元素,position就会加1,直到limit结束。这时候,limit=position。当然,读取的时候也可以一次读取多个,只要传入一个数组就可以了。这个和put方法一样。需要注意的是,如果指明的需要读取的元素多于还剩余的元素个数,则会抛出bufferunderflowexception。

除了基本的读写操作,还有一些别的方法值得记住。

rewind:写入数据的时候,channel中如果有足够的数据,则会尽量填满position到limit。 如果调用clear方法,limit将会被设置为capacity,如果想读取指定长度的数据,而不是填满整个buffer,则可以先设置好limit的值,然后调用rewind方法。这个方法会将position置0,mark设置为-1,但是不会改变limit的值。

compact:写入数据的时候,如果接收方没有完全接受数据,也就是说,调用完write(buffer)之后,position

reset:buffer还有一个变量叫做mark,这个值介于0和position之间,可以认为是程序在get数据的时候,发现一个特殊的位置,用mark来标记住。然后继续读取数据。如果想把position设置为mark,就可以调用reset方法。这个方法只改变position的值。注意,很多方法都会将mark置为-1,也就是不可用,比如clear,flip,rewind,(按说compact应该也需要,但是没有,不知道为什么),这时候调用reset就会抛异常。

clear,put,flip,get,还有compact,rewind以及clear。这些算是操作buffer的基本操作吧。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值