00:02
N nio3大核心组件的原理示意图,前面呢,我们已经说到了NIO的select channel就通道,还有buffer的关系图还记得吧,但是呢,当时我们说的这三者呢,这个图其实我们只是把他的一个简单版说了一下,但是没有对它进行一个整理,就是他们到底是存在一个什么关系,大家应该还是比较模糊的,现在呢,我们把这个图再说一遍,打开这个图,这个图呢。同学们看一下。好,我把这个图先拿过来。这个图就是我们在Excel里面画这个图,一样的哈,一样的我们放到这,放到这里呢,我们现在开始对这个图进行一个梳理,就是它到底是一个怎样的这个这个图反映了这三者什么样的关系,我们梳理一下,跟上老师思路。好,我们一起来说说他是怎样一个关系啊,我们一边讲呢,一边做梳理工作。
01:02
好的,我把这个字体调小一点。14哈,跟上我的思路。呃,我们先看一下,把这个颜色换一下。我们先看一下第一点。第一点,我们要说的是,同学们看每一个channel,它都对应一个buffer,这点很重要,因为这些书上没有写。啊,你看源代码呢,也不一定马上就能看出来,我们整理一下三者的关系,第一个就是每个channel。每个这个channel就是同学们看到这个channel都对应一个buffer,都。都会对应一个buffer。注意这是一定要对应的哈,就是不可能说这个buffer,呃,这个China不会对应一个buffer,如果没这个buffer,这个China呢,数据就没有办法读取了,这是第一点,大家要要有印象的,第二个呢,就是大家可以看到一个select。就是一个select,其实最后最终在程序里面体现出来,它就是一个对象干什么,他会对应一个线程。
02:06
大家有没有看到一个select呢?它会对应一个线程,没有问题,那一个线程呢,同学们看。一个线程对应它可以对应多个channel。能理解哈,我往这边拿一个线程对应多个。多个channel,而这个一个channel呢,其实也可以理解成就是一个连接。就是一个channel,你可以理解成就是一个连接,能理解好第三点我们要说的是,嗯,从我们这看呢,这个select其实就相当于说他管理了三个channel对不对,或者说呃,或者说呃,有三个channel注册到了select上面,这样说应该更严谨一点,就是该图,该图反映了。反映了什么呢?反映了有有三个channel。
03:02
三个channel注册了,注册到了该。Select。那有些同学就说,老师什么叫做China,注册到了select呢,这句这块呢,这句话我现在没法说,到时间用程序来说话,程序会体现出来这个特点,第四一点我要说的是。大家看select呢,它是处于一个监听的状态。就是说切换到这个select,它会去切换把把这个就说到底是哪个圈的工作呢,是由他来决定的,所以说这里面有一句话很重要,Select就是这样写啊,嗯,切换到程序啊,程序切换。报整理,这个我要稍微想想切换,切换到哪个channel。哪个?Channel。因为它会切换到哪个圈,哪个圈就开始,呃,相当于它有一个活动状态嘛,切换到哪圈呢?是由什么呢?是由事件决定的。
04:08
这点大家要理解啊,事件事件。事件。决定的。事件决定的,那么呃,这个事件呢,Event它是一个event,所以说这个event就是我们一个非常重要的概念呢,是一个很重要的概念。重要一点,那我们我们就待会儿后面我们会。我们会说在NIO编程里面到底有哪些事件,有哪哪哪几种事件,我们会专门的说这个事情,接着继续往下看。第五一点,嗯,Select呢,它是这样子的。Select。会根据。会根据不同的事件,不同的事件。不同的事件干什么呢?在各个通在。
05:01
在各个。各个通道上。通道。上切换。好,这是我们说的第五句话,嗯,最后一点呢,就是这个China呢,你可以理解是一个连接,甚至呢,你也可以理解成是我们传统Java的一个stream,这样理解也是可以的。哦,还有一点就是我们说一下buffer。现在呢,我们说一下buffer的事情。大家看buffer呢?刚才我们是不是已经举例子了,它的本质它就是什么呢?它就是一个内存块,为什么我们说。我们说这个NIO是面向buffer编程的,也可以说是面向块编程的,就是因为buffer它本身就是一个内存块。那么是由什么呢?它底层呢,底层是有一个有一个数组的。也就是说它真实的数据呢,还是放在一个数组里面的。这是我们说的第六点第七点第七点啊,嗯,还有一点就是数据的读取,就是在这个NIO里面呢,数据的读取。
06:07
读取它是干什么呢?就是都是要通过读取或者是写写入。是通过。通过什么呢?通过buffer。通过buffer的这一点,这一点这个这个和什么呢?和Java IO,就是我们的bio是有本质不同的。对不对,Bio大家还记不记得,Bio就直接把这个数据往这个通道里面写了,这是一点,还有呢,就是呃,Bio bio中呢。对于一个牛而言,B中要么。啊。要么是输入流,要么是输入流。啊,要么或者或者是输出流写到这啊,或者是输出流。
07:00
或者是输出流。他不会是双向流动的,对不对,就bio里面你要么是输入流,要么是输出流,而不会是双向,不能什么呢?不能兼而有之,不能双向的。但是我们的这个n nio IO的八份。大家还看到没有NIO的buffer呢,它是可以读也可以写的是。可以读。可以读,也可以写,但是需要什么呢?需要使用一个方法,就是力。切换。切换,这一点请同学们注意一下。好,这是我们说的第七点,第七点。最后一点呢,大家还记得这个China呢,也是双向的。哎,就说这个channel也是双向的,甚至它是不阻塞的一种双向啊,就是你读写呢,大家它也是一个非阻塞性质的,还还有一点我们说一下channel。
08:01
就是这个China呢,是双向的。这点需要同学们提醒大家啊,它可以很好的可以反映什么呢?反映我们底层。底层操作系统的情况。什么意思?这句话什么意思?即比如说我举个例子,比如说Linux。同学们,因为都是有基础的同学,比如我们说Linux,它底层的这个操作系统的通道其实就是双向的。Linux系统底层的。底层的操作系统,操底层的操作系统。操作系统通道。通道就是双向的。也就是说我们这个China呢,它是跟这个buffer是对应,你你buffer可以读写啊,可以往里面写,可以读,那么我这个China也是一样的,我不需要,不需要像别人不需要像Java这样,这个流一样啊,我们刚才不是说了吗,China你其实也可以把它看成是一种,呃,有点类似于我们Java IO的流,但是Java IO的流呢,它要么是一个input流。
09:11
要么是一个output流。Input或者是output,而不可能是又可以写又可以读,是又可以写可以读,没有的,但是在我们IO里面呢,它其实都是双向的,Buffer是双向的,我们的China呢,也是双向的。好,这一点请同学们注意一下,好的,那关于这个s channel barber他们的关系呢,老师就整理了八点。整理的八点,大家要有一个基本的认识,好的,那关于这块就说完,下面呢,我们就会详细的把这个buffer,它这里面buffer到底是什么,China是什么,Select是什么,我们就一个个的讲。因为我说了IO里面最核心最核心的三个组件和buffer必须。把它讲到位啊,虽然你你可能会觉得很简单,我告诉你,如果你去看有些有些地方哈。
10:05
有些地方书上写的,其实你自己看的是一头雾水的,你你你通过老师讲觉得这都挺简单的,对吧,实际上实际上这是老师已经把这些东西整理好了,所以说给你讲出来,你会觉得很简单,实际上我我们再去用一个技术,你第一次用的时候,没有人把这个关系给你捋清楚,就光是这张图有些地方都没给你画的很清晰。一下就蒙圈了,说技术本身并不难。我我都认为是技术本身并不难,但关键就是说。你第一次接触的时候是有一个过程的,如果有一个有一个这个比较好的一个文档,他能够告诉你,其实你就省事了,但如果没有就麻烦好同学们还是认真的听就可以了。下边呢,我们准备讲这个buffer,讲buffer之前我们把前面的内容先简单的梳理一下,我们讲了哪些东西,刚才呢,我们是不是已经讲了一下NIO,好,我们插入。
11:01
分页符。好,我们这块讲的是Java n IO的编程的一部分,是不是梳理一下。加vao我们是怎么讲的呢?首先给同学们做了Java n IO的基本介绍。说了一下IO它的一些特点。梳理到这里来。放这哈。一共整理了有这么几点。我来说一说。首先第一个全称,大家要知道。是吧,叫no blocking。它的IO相关的包还有接口呢,呃,它的它的这个接口和类放在这个包下面的Java IO包及其子包。然后有一点是必须清楚的,NIO3大核心组件,Channel buffer和select,我们现在呢,已经有了一个整体认识,但是到底每一个细节是什么还没说。对不对?还有1.nnio呢,我们要理解它是一个面向缓冲区的,有些人喜欢说是面向库编程的,这两种其实并不冲突,为什么呢?因为你缓冲区到底层其实就是一个内存块。
12:07
OK,所以说呢,说面向缓冲或者面向块编程都是没问题的。我们再总结了三点和五点。啊,在这边还有几点啊,把它整理一下就行了。这还有一点就是,呃,哪哪里呢,我们可以看到这边这这一点呢,其实就是说明我们NIO是事件驱动的,其实这句话说了这么多,其实就是一句话,什么呢?就是NIO是事件驱动的。也就是说,他会根据你各个China上发生的事件来驱动程序的处理。OK,好,这边我们就说完,好,里面会有案例,这边我们就举了一个案例说明,这个案例说明。案例说明了这个NIO的IO的buffer。是不是同学们?我们把这段代码呢给大家拿过来。
13:02
这是关于buffer的一个案例。继续往下看。继续往下看,这说完了功能,我们对它做了一个比较,就是NIO和bio的比较。放这来就行。反正就是简单一句话就是NIO呢,比bio要很很好很多是吧,其实就这意思。放在这就可以了。紧接着,我们继续往下梳理。是不是这边有一个非常重要的图了,这个图本身在前面其实咱们已经讲过了,但是呢,他们之间的关系我用文字再详细的说一下啊,每个呢都必须对应一个buffer啊,不可能说有一个China,但是没有buffer,这是不可能的,Select呢,它对应一个线程。它对,呃,对应。它对应一个线程。对,那呃,一个线程呢,可以对应多个China,换言之就是说我们一个S可以干什么,可以管理或者注册多个China进行管理,那么这个S处于一个监听的状态,当哪一个China上发生的事件,那么我们就会去处理哪一个China这样子的,就所以说select呢,它会根据不同的事件在各个通道上进行切换,底层这个buffer呢,呃,这个buffer其实就是一个内存块,数据的读学呢,总是通过这个buffer来完成的。
14:21
对,既可以往这个buffer里面读也可以,呃,既可以读这个buffer,也可以写这个buffer。当然China呢,也是双向的,这点要知道,就说我们通过China呢,呃呃,就好像那个Java IO里面那个流,但是呢,它不一样,就是它它是干什么双向的,它既可以读也可以写,好说明这个这个道理哈。飞到这里。方豪。这是NIO的。NIO的,嗯,这三个核心组件的关系图以及说明。放这儿来吧。关系图的说明呢,我们同样也是给它来一个编号,把图放过来好了。
15:05
拖我们就图,我们就直接扔在这儿。这是不是我们这个图啊,放好就行。放小一点。同学们,那关于我们这个NIO的前面这一点内容,就给大家说到这里。
我来说两句