00:00
那么再建一个项目叫做n na-D01叫NL吧com.N归5.nnao先来一个叫做八分缓冲区,嗯。说第一个说缓冲区,缓冲区英文叫做叫做八分,说缓冲区啊,说缓冲区在Java当中,它是干什么的来着,是负责存储数据啊对,它就一个作用呢,就是存储数据对吧,说它在这个Java,在Java这个NIO中,NIO中负责,IO中负责数据的存取也可以,对吧,叫做存取,就负责数据的存取啊对吧,我们说存数据,什么东西能存数据啊,我们说白了缓冲区它就是数组,缓冲区的底层说白了它就是数组对吧?然后呢,数组是不是用于存储叫做不同数据类型的数据啊用说数组的类型呢,不是有很多种啊,用于批量存储一类数据了,对吧?我们说缓冲区底层呢,它就是数组,用于存储不同数据类型的数据的那。
01:17
那也就意味着什么呢?意味着根据数据类型不同,它是不是有对应类型的缓冲区啊,对吧,我们说根据根据数据类型不同,他们给我提供了提供了提供了叫做相相应类型的缓冲区,根据数据类型不同提供了对应类型的缓冲区,但是大家要注意点什么呢?说波璃这种类型除外,其他的七个基本数据类型全有,说根据类型不同提供了不同类型的缓冲区,都有什么呢?这除了固璃以外,那剩下的呢,就是是不是叫做BE8UFF分啊,是操作败的呀,相英还有叫做差八分是不是字符啊,对吧,那就还有叫做SHORT8UFF份,然后EAT8UFF份,LOOK8UFF份,还有八份,还有八。
02:17
八分,也就是说除了基本数据,除了这个玻璃以外,其他的基本数据类型是不都有对应类型的缓冲区,用于操作不同的数据类型啊,对吧?用于操作不同数据类型,那么实际上这几个缓冲区呢?它们的使用和管理方式都是很类似的,我们说上述这几个缓冲区,说上述缓冲区的管理方式对吧?几乎一致,都是通过什么呢?通过一个方法叫做allocate获取一个缓冲区,通过这程式几乎是一致的,是唯一不同之后就是就在于数据类型不同啊,对吧?他们都是通过一个方法叫做allocate获取对应的缓冲区,那么实际上最常用的我们说是哪个呀?这叫BEST8UFF分啊,因为你说不管是磁盘还是网络传输的是不是都是这个字节,全都是字节,那最常用的就是这个BIT8UFF分。
03:17
增话对吧,那么知道了这个我们是不是就可以分配一个缓冲区了呀,或者是叫创建一个缓冲区,来个叫做test public avoid test1ctrl shift o导一下包CTR1啊把这包找过来,那么这样的话呢,那么第一步我们是不是就可以分配一个指定大小的缓冲区啊,通过lo方法吧,对吧,叫做分配一个指定大小的缓冲区,这个缓冲区方法叫什么呢?通过贝塔buff分,我们是不是以贝塔八分为列,因为它最常用法有一个叫做a locate,我们比如说指定1024个字节,是不是1024个大小啊容量,它会给我得到一个贝塔八分,那这样的话就分配了一个指定大小的缓冲区,这没问题吧,分配了一个指定大小的缓冲区,那么有的缓冲区,我们缓冲区是用来干嘛的呀,是存取出去的呀。
04:17
要不然往缓冲处里存,要存缓冲区中取吧,对吧,那缓冲区就是用于存数据的,那怎么存呢?啊,那接下来啊,我们说那么就是用于存取缓冲区中数据了,呃,缓冲区对吧?存取数据的两个核心方法分别是什么呢?那么就是一个是put,这时候叫存入数据到缓冲区中啊对吧,存入数据到缓冲区中,那么相应的另外一个就叫做get,那这个叫做是不是要取出啊或获取缓冲区中的数据,核心的就这两个方法。
05:02
那就这两个方法,那么接下来大家要注意一件事,我们说我们呢,要想对缓冲群中的数据进行一个正确的存取的话,那么必须了解几个缓冲区的核心属性,所以要想正确的对缓冲区中的数据进行存取的话,那么必须了解它几个核心属性,哪几个呢?我们点进去看一看,首先BET8分,我们说这几种八法是不是都是继承这B法对吧?B法是刚才这几种的,是不是都负类呀,对吧?我们说进去buff法看一眼,注意这里是不是有几个属性,并且这几个属性是不是都有关系的呀,对吧?那这几个属性就是它几个核心的属性,我们必须把他们整清楚,如果他们不清楚,我们就没有办法正确的对缓冲区中的数据进行一个存取,那么过来咱们一个一个分析,这几个都是什么呢?是怎么说缓冲区中的。
06:03
四个核心属性我们必须搞清楚,那第一个我们叫做capacity,那么说翻译过来什么意思啊,是不是叫容量啊,对吧?说它就叫容量,它表示什么意思呢?说表示叫做缓冲区中最大存储数据的容量,这没问题了,就是最多能存多少数据呢?Capacity就表示这个,说它能最大存储数据的容量,说一旦声明不能改变,以前我们是不是也这么说的,说数组的大小在初始化的时候是定下来的吧,是不可定啊,现在也一样,我们底层说白了,缓冲区底层,底层就是数组,那么CA表示容量,表示缓冲区中最大存储数据的容量,一旦声明就不能改变。那么再看第二个,第二个叫什么呢?叫做limit,它叫什么呢?叫做你可以翻过来叫做介。
07:03
限或者限制是不是都行啊,这叫界限,说什么叫界限呢?说表示叫做表示缓冲区中叫做可以操作数据的容大小,对吧,对吧,我们界限它表示缓冲区中可以操作数据的一个大小吧,对吧?可以操作数据大小那代表什么意思呢?说白了就是说limit这个数后边的数据我们是不能进行读写的。数据一个限制啊,我们说它表示缓冲区中可以操作数据的一个大小,意味着另后边的数据我们是不能进行读写,对吧,一会咱们画图进一步的对它来分析啊,那这叫limit。好了,那么另外一个叫什么呢?叫做positionion,对吧?Ton positionion翻译过来叫啥意思啊,是不是叫位置啊,对吧?位置它表示什么呢?表示对吧,叫做缓冲区中正在操作数据的位置,是不是正在操作的那个位置啊,那就是这个position,对,然后呢,它们是有一个规律的,什么规律呢?就是这个position它得小于等于厘米,它小于等于可city你必须满足这几个规,这大概这几这几个属性有一定了解了吧,那说它到底怎么回事,咱们过来再进一步分析分析,比如说现在呢,我通过这个aet是不是分配的一个缓冲区大小啊,那么现在呢,我就可以访问这几个,看看它到底是多大,对吧?比如说通过B有一个叫做叫做position,是不是看看当前缓冲区的位置啊。
08:51
啊,你操作正在操作数据的位置,然后再来一个sit out b.limit说一共能操作多少万啊,再sit out b点叫做cupc,这个叫一共多大吧,容量是多大对吧?那这个时候我们说在c out这个东西。
09:12
说这个呢,是我们调用这个叫做它a lo a lo方法以后,是不是看到一个大小啊,对吧,那我们瞅一眼啊,那右键我们运行一下是不是010241024啊对吧,是什么意思,过来画画图。我来画个图,比如说现在是什么意思啊,现在呀,我说假如说这个是我以a lock的方法分配了一个长度为十的缓冲区大小,听明没有,这是不是通过OC分配了一个长为十的缓冲区大小啊,那么此时它的这个capacity什么的都是几呢?那么这个。
10:01
没有个向上的箭头吗。在哪儿呢?方程反转瞄不准呢,瞄准了对吧?那首先当我通过AK说分配了个缓程区啊,那么这个时候呢,它的capacitycpc为capacity就等于十,我是以十对吧?那这个时候capacity为十,注意与此同时呢,这个limit对吧对吧,也是十哈不哈,就你可疑读写数据的数量是不是也是十啊对吧,长度也是,那这个时候position在哪呢?Position呢在这就是你当前可操作数据的位置吧,对吧,这个时候position它是等于零,初始的时候它是零是不吧?对吧?那现在就意味着什么呢?现在意味着我的缓冲数是空的,我说可以往里就写数去啊,从我C这位置是不是开始啊对吧,那我们说开始写数据,那刚才你说一下存储数据的存数据是不是put呀,对吧?那咱们put一下试试啊。
11:07
那么说二二,我们说叫做利用叫做put方法,Put方法叫做存入存数据对吧?存入数据到缓冲区中去对吧?那么我来存点什么呢?比如说我这时搞个字符串吧,搞一个string s点等于abcde这五个字符啊对吧?然后这时候呢,通过buffer换成区吧,点put,大家看这几个兔的是不是也能认识吧,存一个字节吧,存一个字节出走吧,你还能从另外一个缓冲区到我当前缓冲区吧,对吧,然后还能从第几个索引位置存一个字节吧,对,然后你存一个字节数组到缓冲区,从第几个索引位置开始存几个是不是都能认识啊,现在对于我们来说,看看API那还是很轻松的吧,对吧,大概都能知道对吧?那这个时候呢,我来存个字节数组,我要把这个S撇点改。
12:08
是不存这么多个呀,是吧,存这么几个,那存完了以后说当我调用to方法以后,它又变成了一个什么效果呢?注意看,以我这个为例的话,它是不是就变了呀,变了呢,我再复制一份对吧?说当我定了put以后,首先这里边是不是有五个数据对吧?有五个数据,然后呢,这个时候啊,Position对吧,Position就到了这,也就是它的值变成了五,你当前操作的是在第五个索引位置,也就是你即将要操作的是不是就这个位置对吧?那这个时候position就移动到了这,然后limit和capacity没变。正是吗?对吧,厘米的它没变,然后呢,接下来对吧,那相应的,那你存存完这数据,有的时候,那接下来我是不是要取呀,我是不是该取刚才存的那几个数据,我是不是有的时候想把它取出来,那么现在呢,你甚至于可以把这个状态是不是理解为写数据的模式。
13:12
你将来要往里写,你说接着这个position继续往里写啊,你说现在这个处于一个写数据模式啊,对吧,你就可以把它理解为这叫做写数据写数据模式。这能看懂吗?那么接下来我是不是要读,我们把刚才那组数据读取出来对吧?那这个时候我们再来个切换一环,那么说怎么来呢。我们通过调用一个方法。好,我复制一份对吧,我们通过调用一个什么方法呢?通过调用一个叫做flip方法,含义就是你可以叫做切换到叫做读数据模式,说怎么flip呢?当我一定要用flip方法以后,注意看这几个属性的变化,首先position变成了几呢?变成了零,是position位置到这了呀,对吧,Position到这儿,与此同时这个limit它的位置也变了,对吧,叫做limit。
14:18
是不是到这了呀,对吧,我给他删掉。是不,Limit变为五啊,然后cat city是不是还是没有变,那这个时候limit是不是就到这了呀?那意味着现在我可以读取几个数据啊,这五个数据啊,那我就可以从position开始啊,就把这几个读读取啊,也就是说limit后面的数据我能进行读写吗?那是不行了,对吧?那这就是flip以后就到了读数据模式,刚才可以把它理解为写数据模式,一定要这是不就叫读数据模式啊。那这几个属性能搞清楚吗?是不差不多啊,对吧?那接下来咱们回过来继续试一下,刚刚才我说put往里放了五个呀,五个字节了,对吧?那这个时候呢,我们说put以后说这个时候当我调用put以后,我是不是再看看position limit和position对吧?那么你猜一猜position电几?Position我不是八分然里头写了五个吗?五看position没电吗?Position那是变五了呀,米的呢,是不是一该24呀,看呢,是不是应该二四对吧?你问一次是不是得变了呀,对吧?我当我碰到了以后,是不是不写五个呀?那position是不是到这了,但是内力等于CAS是为量呢,对吧?那这个时候我们试一试,右键运行是五,然后1024 1024啊哎。
15:58
能看清楚吗?是吧,这个清楚吗?那么相来论来干什么呢?我要准备取,或者说叫读数据。
16:07
我要读数据的话,说以现在这种状态,我们能读吗?你说永远从准这个当学内的开始啊,后来有你读的数据吗?那因此我读以前必须得整一下是不是切换成模式啊,对吧,叫做切换成是不是切换成读取数据的模式啊,刚才我们说通过哪个方法切换读取数据模式,叫做方法切换到读取数据的模式,那么一切换position归零吧,对吧,实际上另的值是不变为上一个position了,他们非得说不变,哎,那这叫做切换到读取数据的模式,那么切换完了以后,咱们是不是再看看它的这几个值是多少啊,对吧,来吧,你猜出第一个是几,这个是几这个呢?哎,那我们试一试右键运运行是零五,一般算。
17:07
没问题,那接下来我们是不是就可以读了对吧?再往下读呢,就是有效数据对吧,叫做利用,这用什么方法来着?读学钙的方法叫做读取缓冲区,缓冲区中的数据对吧?然后呢提用通过do f.get对吧?那这几个方法是不是大家也能认识啊,第一个叫读一个字节,第二个叫读字,读取字节放大字节数组中呢?然后从第几个所引位置是不是开始读啊,然后下一个是读几个字节数组,从第几个所以位置开始读,读几个是这意思吧,对吧?都能会,那比如说我们就用哪个呢?用第二个是不给它读到字节数组中去啊,然后来个叫做BAT数组,叫做B呃,BST呃,New bet这个数组长度上它是多少呢?BF点利米它行不行可以吧,对吧?然后呢,叫我将读取的数据。我把它。
18:07
打印到控制台,说白了数据是不是全在这个字节数组存着呢?我就把字节数组转成string打印一下可以吧,通过DSD从零到呃,叫做D st.length是不是可以对吧?叫DST认对吧?那么这个时候呢,我们get完你们再猜猜这几个位置是几了。Get了get get get你是不是你get获取的时候,你说获取一个呀,位置是不是移动啊,下一个下一个下一个下一个呀,对吧,那应该是几了,应该是五五应该是四了,对吧?那我们试一试,那这个是右键运行551024吧,刚才读的abcde,我怎么打印到空台了,打印过来对吧?五不行,这个不能是put了吧,这个叫做get完了是吧?Get以后以后就变成了551024。
19:15
看能吗?对吧?那这就叫读数据模式,是能做一个基本的存取了,这几个位置是很关键的,对吧,非常的关键,那么这个时候咱们再了解一个什么方法呢?它还有一个方法B5叫做re外对吧?Re外的方法说这个re外是干什么的呢?咱们注意看一下啊,那这个时候呢,我必须往下出点啊,Rew外的一下对吧?然后呢,Revid以后我是不是再看看这几个位置啊,这个叫做revid对吧?然后看看啊,看看什么效果,看看什么效果,右键运行。051024这是什么意思,意味着你是不是又继续可以读了,是回到回到读模式了呀,你下来是不是又可以继续往下读了呀,对吧,你是不是可以读了,那这个含义就是你是不是可以重读,是不是可以重复读刚才的那一个数据啊,从这个读模式是不是接下来继续进行啊对吧对吧,那我说这个rewvid呢,就好像就是说可重复读数据,是不就重复读对吧,对吧,重复,然后呢,最后这来是什么呢?刚才这个我写错了,这个不应该叫复,这个叫F力对吧,对吧,Flip啊然后接下来看什么呢?最后啊,我们说还有六叫做清空缓冲区,叫做clear,叫做清空缓冲区对吧?那么通过BF.clear一下,对吧?那么当clear以后呢,我再看看这几个数据都变成了什么。
20:52
什么对吧,这叫做可对吧,是不是呀,那这个时候我们再来右键运行clear以后,010241024是不是回到了最初状态啊,对吧,这叫clear清空缓冲区回到了最初状态,但是大家要切记一件事,我虽然说我清空缓冲去了clear了吧,但是里边的数据并没有被清空。
21:18
听吧,里边的数据还在,对说对说你氢能的缓冲区对吧,但是嗯嗯,缓冲区中的数据对吧,依然存在,只不过这些数据呢,它处于一种叫做处于一种叫叫叫做被遗忘状态,什么叫做被遗忘状态呢?就是说它的这几个指针是不是全回归到最初状态了,你还知道里头有几个数据吗?是不是不知道了,你就不能正确的读,到底读几个啊,最初就不知道来了,所以说我们称它为叫做被遗忘状态,那我们这里头数据到底有没有呢?我们是不是可以试试啊,对吧?比如说BF我再get一个可以吗?我说在get一个字节,看看里头有没有啊对吧?Get的这一个字节呢,我把它转换成叉试一试,这个时候再去选中右键运行有没有。
22:18
所有啊,对吧,说缓冲区域虽然被侵空了,但是里边的数据依然存在,只是处于了叫做被遗忘状态,什么叫做被遗忘呢?就说里边呢,那些位置啊,呃,界限呢,是不是全都变了呀,变到了最初状态,你就不能正确的去读取数据了,读写数据。Abcd,当然有了,那你知道现在我们写知道里头有五个,那你的缓冲区你知道到时候从哪儿来呀?从网络另一端来的缓冲区,你知道里头有几个知道吗?是不知道啊,对吧,你现在自己损你数了五个,我要放了一篇文章呢,对吧,所以说现在是不是就属于被一方状态了,对吧?好了,那么这就是几个常数没问题吧,这样是不是就能正确的读写数据了呀,那么再来,那刚才我说看到的不只是这三个吧,是不止这三个,你们看到几个是不是,哎,还有mark啊对吧,说还有一个,一个叫什么呢?叫做mark,核心的是上面这三个mark什么呢?Mark啥意思啊,输出标记啊,它用于表示什么呢?用于叫做可以记录当前position的位置,可以进入position的位置,然后呢,可以通过一个什么呢?叫做reet恢复到刚才mark的位置,含义就是mark标记是不是可以记录position的位置,然后通过re赛再回到mark第六的那个位置啊,能听懂啥意思吧?
23:52
我们过来演示一下就知道了啊,比如说现在我说一然可以分配个缓冲区啊,叫做be塔八分对吧?F fe,用F等于BE8分点上a lo,比如说还来个1024,那这一次呢,我还是往里头存一个ABC be吧,那么这样定义我是不是存数据叫做PM.put放个S点点get BA是不是叫做存数据了呀?现在我是要取取我得怎么办?
24:23
是不是先切换模式啊,对吧?通过BF点把Le是不是要切换成读模式对吧?切换成读模式我是不是就可以读了啊?通过BF.gett get到be数组中,我就搞一个be数组dst new bet这里来个b.limit然后这次我读几个呢?我利用它那个重载方法,我从第零个所以位置开始读,我先读俩。可以吧,我先读俩,读俩了以后呢,我就给它c out一下,然后用一个string把DST转换从零到呃到二吧,那这样的话我们是不是就能看看这里边读没读到啊,右线直行是不是有了,读了个B,读了个AB以后,我们现在缓冲区的position处于第几个位置,那是于二啊对吧,移动到了二,右键运行是二啊对吧?那这个时候在干嘛呢?我要mark标记一下,看懂吧,对吧,通过mark mark呢标记一下,然后呢,B点是不是mark一下啊,Mark一下接到我位置是不是继续去移动啊,比如说我接着继续去读,通过b.get读取,这次读到DS,从二读俩可以吧,对吧,然后再去set out,用一个string。
25:50
DSD从二到二可以吧,转换成输出一下,那这个时候右键。运行是不是又读俩呀,又读了两,这回再问叫做position的位置是几对吧?那应该是四对吧?那就是呃,八分点position对吧?看看这个位置再去右键运行是四了对吧?那至于这个时候呢,我来个叫做是不是重置啊,叫做reet对吧,它是恢复到mark的位置吧,对吧?那这个时候呢,来个叫做b.reet接下来我们是不是只需要看到position位置就可以了呀,Since out叫做B of.position是不是再看到position几啊对吧?那这个时候再去右键。
26:43
运行是不是啊,对吧,那这时候就是恢复到了mark的位置啊,这就是mark和re赛,这不稳定吧,对吧?那么相应了它们几个,它们四个之间是不是有规律的呀?对吧?首先是零小于等于mark小于等于trans对吧,小于等于limit小于等于color,这就是它们的规律,对吧?那这个就是缓冲区中的四个核心属性。
27:15
能看懂吧,对吧,那要说方法呢,还有一些什么常用方法呢?比如说if通过B,还有个叫做has remaining对吧?这个是说什么呢?说缓冲居中还有没有可以操作的数据了是吧?还就含义是说还有没有剩余的呀,说如果有剩余的呢,我们说看看这个f.remaining对吧,这个叫做如果有我看看还有几个对吧?这个叫做判断缓冲区中是否还有剩余的数据,如果有说不看了几个呀,对吧,叫做获取缓冲区中可以操作的叫做数量,这没问题吧,对吧,再去选中右键。
28:03
运行。是不是三个呀,对吧,刚才到二可操作的还有三个之间。是不是对吧,那么利用这几个我们是不是就可以对缓冲区中的数据来一个正确的存取了,对吧。
我来说两句