00:00
我们举一个例子来说一下NIO里边的buffer。写一个基本的案例,来说一下barber是一个怎样的东东,好,我们来看一下,那现在呢,我们在这开始编写。新建一个新包,这边讲的是NIO了,对不对,叫come at硅谷点NIO硅谷。点nio。好的。我们先举一个最基本的案例。Basic。啊。Basic,然后buffer吧。我们看一下在NIO里面buffer它到底是个什么。举例,我们写一下举例说明。说明buffer的使用。Buffer的使用。也就是说现在呢,我们来看一下在我们NIO里边,这个buffer和程序之间可以怎样去操作,因为后面这个buffer呢,是一个非常重要的核心的一个组件。
01:07
这里面我们先来做一个简单的案例。简单说明,后面还会详细的说好看一个。首先呢,我们创建创建一个buffer。对buffer呢,它有很多类型,它有很多类型,比如现在呢,我们创建这么一个buffer。Int。Int buffer。看到没有,Int buffer里面呢,它有个分法叫allocation allocate,比如说我这里写一个五。那这句话是什么意思呢?大家看一下。这句话就是我创建了一个buffer大小。威武。即及可以存放,可以存放五个int没没问题吧。那当然这个buffer呢,还有其他类型,比如说float。比如说double等等,那后面我们在哪里还会想讲呢?讲到这,讲到后面的时候,我们还会对这个bber想讲,比如说这。
02:07
在后面一个章节buffer,我们还会说这个buffer里面有哪些常用的方法,这里呢,我们先做一个简单的说明,好吧,跟上老师思路就可以了。当我们创建一个buffer过后,我们怎么去用呢?怎么去用呢,我们现在这样做啊,像。向buffer中buffer中呃存放数据,存放存放数据。存放数据的操作,这样子我们往里面存。这样子我们就直接往里面这样写写就行了哈,Int buffer.put。好吧,比如说我铺的一个十,你看这就进去了,就放了一个十,然后呢,我们接着往下继续放,我再放一个11 12,十三十四。看到没有,这就是。这就是那个往里面放数据,那呃,实际上你你如果说不这样放也用一个循环也可以的,比如说我们这样来放也是OK的,怎样放呢?For循环。
03:08
Int I等于零,I小于。在。Buffer里面呢,它有一个方法叫做capacity。就是它的容量有多大,哀加加。比如说我们这次呢,这样放好一点,Put怎么放呢?比如说我放一个I乘以二。明白我的意思吧,就是我随机你你随着I的循环呢,每次。把I乘以二的值放在这个buffer里面去。这就是存放put就存放,存放完了过后呢,我们肯定还要讲一个方法取出啊,如何如何从buffer取数据呢,或叫读取数据。那么读取数据呢?这个时候首先第一个动作很重要,要八份。B点什么呢。
04:01
啊,福利这个方法是非常重要的,这个方法是干什么呀,这个方法是完成这样一个人将buffer转化一下。转换什么转换呢?就是读写切换呢。切换,这个很重要。也就是说我们这个buffer呢,既可以往里面放,也可以读,这是很正常的事情,但是你在去呃进行这存放转读写过后呢,需要。把这一个方法进行调用一下,就是play,这就是翻转的意思,就是读写切换。读写切换,OK,那读写切换完了过后呢,我们怎么取呢?非常简单,用个Y循环就可以了,Y循环里面有个B本A点,它有个叫hands。Remain。就是说如果还有剩余的呢,我们就继续读,我就把它输出来。怎么输出呢,问你呢八本。硬的buff分点get就可以了。
05:02
注意啊,他每他这个get呢,里面维护了一个索引。维护了一个索引,它每get一次,这个索引就往后面移动一次,也就是说你可以简单的理解成我们这里面有一个。五个空间。啊,第一个呢,存的是零,第二个存的是二,第三个是对不对,第一呃,再来一个就是六,再来一个八,那第一次取的时候呢,是零,这个肯定的,然后取的是它这个get get过后呢,其实这个指针就会后移一下。至于这个指针里面有哪些东西,后面我们还会详细说,再取一次呢,又往后面移一下,再取一次又和后移,再取一次再后移,然后再取的时候呢,它这个汉字remaining里面就返回一个boss就结束了,但是这个地方一定要记住,一定要有个flip切换,这个很重要。它这个切换其实就会导致我们这个buffer里面的几个标志进行一个变化。具体是哪些标志呢?我我们在后面还会说,你看在这里我们还会详细的说一下,这个buffer在在这,你看在我们这个buffer里面呢,它有一个position,有个limit,有capacity,具体还有一个mark这四个嗯,标志或者它的属性啊,这个buffer属性呢,我们会后面会详细讲解释,那大家有兴趣呢,可以先这样子先切进去看一下。
06:24
我们看一下源码。啊,先简单看一下,大家看int buffer呢,其实它继承的buffer对不对,我们再往里面注一下,同学们看,在这个buffer里面其实就有这么四个属性,Mark position limit capacity,它下面呢,每一个都做了相应的说明。后面我们还因为后面会详细说这里呢,我就不再去说了,好大家知道buffer它是怎么来的,那有些同学说老师那这个buffer里面有哪些纸类型呢?我们可以看一下。大家可以看到,对于一个buffer而言,你看那面有int buffer float buffer char buffer double buffer short long be,也就是说除了booing,我们JAVA8大基本数据里面,布尔类型没有,其他都有。
07:10
看到没有,都有,那这个为什么它会提供这么多buffer呢?就是因为回到这个图,就是因为我们在数据读取,读取的时候,我们可以根据数据类型来放到对应的buffer里面去。这样呢,我们数据读取的效率就会提升,对好的,这是我们简单一个说明,好,现在呢,我们运行一下,看看目前是一个怎样的情况,好吗?运行制。来一个。那这个时候呢,应该会输出零。二看02486啊468对不对,这就是我们的一个最简单buffer的使用,好接着呢,我们继续往下看。接着继续往下看,这说完了哈,往下看。好,那么NIO和bio的一个比较呢?我们也简单聊两句好。
08:00
Bio把这个案例说完了,跟我们一比较,大家就看出来了。bio呢,它是以流的方式进行处理的。Bo是以流的方式处理的,而NIO呢,是一块的方式处理的。也就是说,它面向这个八份块IO的效率要比流IO高很多。还有一点,Bio是阻塞的,而NIO是非阻塞的。他怎么做到这个阻塞和非非阻塞呢?Buffer起了很重要的作用,就说就相当于说我们原先这个管道哈,程序这个B这个程序呢,直接对我们这一个连接或者是个通道进行这个处理,现在我们多了一个buffer,有了buffer当然我我就可以有一个非阻塞的动作了,对吧,你数据到了一定程度我再去,到了到了一定的这个量我们才去,才是程序再一次性的读取。啊,这样就可以做到一个非阻塞,那么BIIO呢,它是基于字节流和字符流,它可以基于字节流和字符流进操作,NIO基于这个channel和buffer进行操作。
09:06
数据呢,总是从通道读取到缓冲区,或者从缓冲区写入到通道,就是也就是刚才老师画的哪个哪个意思呢,就是说我们这条线。就通道,通道和buffer之间呢,它是双向的,它既可以从buffer流向channel,也可以从channel流向buffer。对,就这意思,那当然有些同学说了,说那这个通道你怎么没有没有讲呢?不着急哈,在后面我们讲通道的时候,还会把通道和buffer他们之间的关系,他们之间怎么操作再给他讲一下。Select呢,用于监听多个,它是用于监听多个通道的事件,比如说连接请求数据到达,因此单个线程可以监听多个客户端的这个呃通道,也就是说我们这个select。这个select呢,其实他是处于一个监听的状态,他会被这个事件驱动,如果你这个通道发生了一个什么事情,那么这个select呢,就会选择到这个通道并进行处理,如果你这个通道是一个inactive的,也就说是个非活动的状态呢,那我也不会阻塞在你这个通道。
10:12
所以说这样呢,就可以实现一个线程怎么样管理多个连接或者多个客户端,这样子来的,好同学们,那关于呃,一个最简单的NIO。关于barber的一个使用,我们就说到这里。
我来说两句