00:02
Poedly。Nike提供了一个专门用来操作缓冲区的。工具类,这个工具类呢,大家可以认为是Nike的数据容器。那他常用的方法呢,是这样一个方法,其实前面我们已经用过了。Co buffer,诶,同学们还记不记得在我们前边?对,我们找一段代码哈,Handler大家有没有发现,嗯,在这里我们已经用过了,就是onported copied buffer,那这个on破的这个类呢,非常的重要。大家还记不记得我们在学NIO的时候,我们学个学过一个bit的buffer,那现在这边有个bitt也是buffer,但是名称不一样,对吧,是BUF,那这两个游戏,呃,就说这个是我们ni提供的数据容器,那现在呢,我们就来看一下。就是呃,On破的类,它的基本使用方法是什么?首先呢,我们看下面有一个例子哈,这大家看on类呢,获取ni的数据容器bit buffer基本使用在这里面,它涉及到了呃这个容,关于这个bitt buffer呢,它里面有非常重要的三个信息,一个叫read reader index,一个叫writer index,还有一个叫capacity。
01:26
那这三个,呃,这三个值,或者说这三个属性,它有什么作用呢?我们来看一下。那现在呢?我们来举例子说明。建一个包就叫。Buffer吧,咱们就叫buffer。好,我们举例说明,我们先看第一个小案例,叫ninety ninety bit。八分零一。低干力。我们来看一下它的基本使用方法。
02:01
嗯,看一下,而且呢,要注意他跟我们NIO的bit buffer有什么区别。我们先看第一句话,就是先创建,创建一个bit。Buffer,好,我们怎么写呢,On。On。这个onp就是非词化的意思,点by buffer,我们在这里直接指定一个大小,比如说十。好,那么这句话呢,它会就会返回一个buffer。我们就be buffer哈,B buffer吧,那我先解释一下它的。作用是说明会创建什么呢?创建。创建一个对象。诶,中间与对象,该对象包含包含。包含一个数组,叫,该数组是什么呢?是一个这样的数组,BY10。
03:02
也就是说你这样写完的过程,它返回的是它这一个对象里面包含一个数组,这个数组里面呢,其其实就是一个bit数组,它能够存放十个数,十个BA,十个bitt进去。那现在呢,我们就循环的给它赋值。我们来定一个int I等于零。I小于什么呢?大家看这个地方,我就写个10I加加。好的。爱加加,那现在我们往里面怎么放呢?大家可以看到它提供了这样一些方法。Buffer。Buffer点什么?有个right bit啊,它有很多方法,看到没有right by。Red,比如说现在呢,我们就往里面写一个I,当然有同学说说老师,老师你这这个I不是整数吗?注意,如果这个整数没有超过这个BAT呢,它是能够存,它会自动给你转成这个BAT放进去的啊,可以的,然后我们再输出一下。
04:03
输出输出的时候呢,我们要输出。I等于零。I小于buffer,来,这次来一个capacity。好,嗯,同学们,这个capacity thirty呢,它其实是返回了这一个八本对应的这个数组的长度,我们来看一下这个方法是不是这样写的。好,我们找一下它的,找一个他的时间内来看。比如说咱们找一个这个吧,破的大家看是不是返回一个长度啊,诶就是返回一个长度。所以说呢,这个capacity其实就是它的一个容量,或者说你认为认为就是它这个对象里面包含的这个数组的大小。啊,就可以认为是容量。我们我们在这呢,也输出一下。Couple。CT等于。这个啊,如果没什么问题的话,他应该返回十。
05:02
那现在呢,我们就来输出,输出的时候呢,我们这样输出就可以了,是什么点Ber.get那我们get一个bit。然后呢,有写个I,写个I就代表我要输,我要得到的是第几个啊,要我要得到第几个。好的,那现在我们看这个BY词这个写不要加S了啊,直接写写一个BY就是得到它这一个数组里面的值,那大家有没有发现在这个整个这个过程中,我并没有使用flip,而我们NIO的buff其实是要用flip转换一下,所以说我们在这里呢,又总结一点。啊,在我们的ninety ninety的八分钟。八分钟干什么呢?不需要,不需要使用flip进行反转。进行反不需要了,那为什么它可以实现这个功能呢?其原因就是因为这个bad buffer里面,它维护了刚才我说的非常重要的两个属性,一个是read index,还有一个right index,注意type thirty呢,在这里面没有看到其他属性,但是呢,它是可以获取到这个数组的长度的,好。
06:17
我写到这里啊,它维护了,因为底层维护了。李晨。维护了什么呢?维护了一个reader。Index和writer。Inex。是吧?好的,那现在我们就来看一下,嗯,这这几个范围到底是怎么样子的啊,它怎么来进行这个不反转也能够进行,既可以写又可以读呢,我们来在这下个断点来跟着老师思路,首先我debug一下。同学们可以看到往下走。
07:00
执行。哪怕执行完了,过。往下来一下,好的,大家看ber里面到底有什么东西呢?点开一看就明白了,首先看有个rra,这个rra是不是一个BIT10啊。对,是一个数组里面呢,可以存放十个数据,初始化全是零,那同学们看到这里面呢,还有一个reader index,还有一个write index,那我说一下,Reader index表示的是下一个读取的位置,而writer index代表下一个写入的位置。明白好这两个呢,我写一下注释,诶这个待会再说吧,好,我们往下执行,看一下它的变化。来,我们看看它的变化。把这手往上挪一下,主要是看这两个索引有没有变化啊,来走好,我往里面写了一个,大家有没有发现writer index在变化,这说明你下一个写入的呢,就应该是下标或者索引为一的这个位置。以此类推,看不停在变化,走走走走走走走走走走走走到什么时候就退出呢?走到十的时候就退出了,他发现你现在这个下一个写的位置是十,但是呢,你这个I。
08:13
已经,呃不再小于十了,就直接退出,退出的时候呢,我在这里拿到这个八分的capcd,注意这个cap设其实在你创建好的时候,它已经等于十了,对它这是它的最大容量,接着往下看,返回一个十,看我们的控制台。没有问题吧,好,紧接着我们继续往下看,那这时呢,我们又没有没有进行反转,我们就直接读,读的时候他会怎么读呢?来看我们这个图,他在写的时候呢,同学们看这里写的时候,它其实是认为这个位置是咱们可写的范围,就是你的right index和capacity是可写的位置,你看你刚开始创建的时候,是不是两个都是零的,最大是事实,所以说你可写的位置其实是。这么一一个空间。那现在读的位置呢?大家可以看到读的位置就是reader index和write index,这是我们可读的字节。
09:10
那现在大家想一想,此时此刻你的范围是不是这是零和十,就说你可以。你你先可以读这个零一直读,读到什么时候呢,可以读到这个十个数据,当然这个writer index这个地方你是读不到的,为什么呢?因为你实际的范围是它其实是读取的是。Reader index到十之间的数据。啊十这个下边为十的位置,其实已经约见了,你是拿不到的,对不对,所以你其实读的是零到九明白,好同学们,我现在呢,给大家输出看一下效果。好,当我每执行一次,你会看到reader index是在逐渐的变大。看变成一了,读了一个就变成一下一个读的是。哎。哦,这地方不是这样子的啊同学们,这里面呢,我用的方法是用的有个I,那说明我在这里面是指定I,还有一种读法就是什么呢?就是还有一种读法是这个读法才会导致我们这个reader的变化,哪个呢,我先写到这里来,就是还有一个方法是buffer.read。
10:14
这种方法呢,才会导致reader index的增加。我这这个时候用的方法是什么呀?Get bit,那这个I是指定指定的,因此呢不会造成reader index的变化,好所以说他会把这个数据十个数据全部拿到。这个过程中,你会发现reader index没有变化。为什么?因为你是通过指定一个索引来获取的,接着往下走。好,结束,结束过后我们看控制台零到。读读取完毕再一执行就退出来了,好。那么下面呢,我们再来一个方法,下面呢,我们再用第二种方式输出,就能看到reader index的变化了。走一个。
11:00
不循环。Int I等于零,I小于八分,点cap I加加走起来,那这时呢,我们换一种读法啊,叫BBer.read。BY,那这个时候就会造成我们reader的变化,那现在我直接把断点下到这里,好吧,我们直接看一下同学们这个这在输写一句话执行完毕。执行完毕,同学们看,我现在仍然是第八个。跑起来。抛起来过后呢,我们看此时此刻buffer呢,目前的索引仍然是reader等于零,ER等于四,说明目前如果你用这种方式,就是不去指定索引的方式来读呢,它其实可以读的范围就是零到十之间啊,包括这个零,那就是零到九,实际读取的是零到九。好,我们看一下有没有变化,来同学们跟上老师思路,下周来同学们看。
12:00
同学们看到这个reader index是不是在不停的增加?增加走走走走走,好,同学们看在下这个还是能读出来的。这次就读不了了,因为这时呢,Reader index已经等于十了,等于十,它其实是十,不再小于它的capacity,因此呢,就直接退出。所以说我们再次来看关于我们这一个。就是。就是我们ni提供的reader b,呃,这个buffer呢,我们可以总结出这么几点,第一点呢,它不需要反转。底层维护了reader index和writer index,它能读取的范围应该是这样子的。就是将什么呢,通过,诶我们这样说,通过这两个参,这个reader index和这个writer index,还有我们的一个容量,就是还有这个值就capacity。将我们这个buffer分成了三段,将什么呢,各位?
13:04
将buffer。分成了。分成了三段。分成。三个啊三个。三个区。哪三个区域呢?我们来走一下零到我们的reader index。这个区,这个区代表什么?大家看这个区代表是的斯cardable by次就是这个范围呢,就代表你已经数据已经读过了,明白我的意思吧,因为你你这个reader读一下,你reader应该是往往后移吗?说这个第四这个就是就是我们的discardable by就是已经读过的范围就是已经。读取的。这个区。好,呃,那么还有一个呢,就是同学们看到了reader。
14:02
到哪一个范围呢?到。这是可读的区域。可读取。可读的区。好的,还有还有一个范围呢,就是同学们看到了writer index。到我们的capacity,注意这个capacity呢,是通过我们一个方法拿到的,其实就是我们的这个数组的大小,也就是说你这个包含的数组的一个。这个表示什么范围呢?表示可写的。可写的区域就是如果你再去操作的会可写的区域是这个可写的区域。就这样子的。好,所以说我们可以看到它这个使用的特点,就这样子的,好,那关于它的一个基本的使用,第一个案例我们就聊到这里,大家看一下它的特点,好吧,看一下它特点。
我来说两句