00:01
第一个关于通道的案例,第一个案例呢,我们是这样一个要求。本地文件写数据什么意思呢?就是使用前面学习到的bad buffer,就是字节缓冲,还有fair channel,将hello上硅谷写入到一个文件中去,但是呢,这次呢,我们要用通道缓冲的方式来完成,如果文件不存在呢,我们就创建这个文件。对,如果存在我们就直接向已经存在的文件里面写,现在呢,我们就来走一下这个代码,这个代码呢很简单哈,但是呢,它主要是第一个就是大家来看一下怎么把通道引入到我们这个IO中。那打开我们的这边idea,我们写一个写写个程序。新建一个家类,写个名字我们就叫。NIO。IO的一个fire。
01:04
好,这是我们的第一个案例。写一个总方法。然后咱们怎么写呢?首先我们先创建一个字符串,这个很简单,我就直接写哈,然后string。早,我们歇哈。哈喽,上硅谷。好吧,这边来一个逗号。写好。那第二步我们该干什么呢?同学们注意哈,就是我们这个NIO呢,其实它是对Java原生IO的一个包装,因此呢,这里面还是会用到我们原生的Java的IO的一些相关知识。现在呢,我们要创建。一个输出流。OK,那么这个输出内容呢,将来会把它包装到我们这个餐里面去。
02:00
OK,那我先来创建一下六一个画。Output stream。对,然后我指向哪个地方呢?比如说待会我们把这个文件写到这里去,fire01.tt。好,然后我们分配一个名字。对面这是一个输出流,当然这边就会有一个异常产生了,我们扔出去。好的,紧接着咱们继续往下写,我们刚才讲过,得到一个输出流过后呢,我们要把这个输出流,通过这个输出流得到一个channel,对。第二句通过通过这一个输出流获取,杜一听这句话获取对应的什么呢?文件参。文件channel,也就是说你可以理解成我们在NIO中对这个输出流进行了一个包装,如果我们画一个示意图的话呢,大致可以这样去理解。
03:03
大致可以这样去理解说,这是我们的文件。文件呢,我们用这个图形,好吧,这是我们的文件,OK,这是我们文件,那么在我们最原先的时候呢,这有一个流。对吧,这有一个流跟我们这个文件呢,关联起来还有印象吧,叫输出流,比如说我们这样画啊输出流。画一个这样的标号,那这个是一个我们的原生的Java的,注意听这是原生Java的一个输出流。对象。那么这个对象呢?会被谁呢?会被我们的NIO的一个channel包装包裹起来,或者包装起来都可以。我们换另外一个颜色。好,我把它自理。直到下边去。好,你可以认为我们这个Java,呃,输出流对象呢,被我们这一个channel,呃,就是我们NIO的一个什么呢?Fire China包裹起来了。
04:08
对,包裹起来了。这样子理解好,所以说这样一句话呢,就可以这么去理解,怎么得到呢?非常的简单点,走一个,我们叫什么呢?Get channel。大家看到它返回的是一个fair channel,但实际上我们讲过真实的类型是fire channel implement,是不是刚才已经讲过了?分配一个名字。对,就这个channel吧,咱们取个名字叫fair channel。OK,实际上这个类型再说一遍啊,注意这个类型就是我们的发圈的这个类型。它的真实类型,一定要理解,它的真实的类型是什么呢?OK,是fair channel。好,写到这里就可以了,也就是说它实际上它的真实类型,它待会儿呢,我们可以debug一下。然后下一步该干什么事情呢?大家不要忘了,因为我们现在是IO操作,所以说我们这个channel在跟数据交互的时候呢,其实是要通过一个缓,通过一个缓冲的,所以说我们现在创建一个缓冲。
05:14
哎,缓冲区缓冲区,那么这个缓冲区显然用bit channel,呃呃,Bit buffer是比较合理的,因为我们知道bit buffer呢是我们用的最多的,所以我先创建一个。这样的,那很简单,我们就bit。什么呀,Buffer?对不对,点allow。我们分配多大呢?比如说分配1024的。拿到一个我叫buffer吧,就叫败buffer。那也就是说这句话一旦一旦创建了过后呢,你可以认为啊,你可以认为在我们这边就会产生一个buffer。理解哈,大小呢,刚才咱们已经也说了,这是个bad buffer。
06:01
OK 08:08。那这个bad buffer呢,它真实的数据我们就要从这读取了,大家看是不是我们这边有一个数据叫hello。哈喽,上硅谷,那待会儿我们会怎么操作呢?同学们,我们先把数据。哎,我们先把数据呢,写作的这个buffer,看这个流程同学们,因为大家第一次用这个,我稍微的细致一点,数据先流入到我们buffer。再把这个buff分呢。写入到。我们的一个,呃,就是。Fire圈了,再把再通这个fire圈呢,它包裹的输出流对象写进去,其实它底层呢,还是靠这个写出去,写出去的,只是呢,被我们fire圈的包裹起来了,所以它的流程是这样一个流程,能理解哈,那现在我们创建一个bit buffer。那重建BYB已经创建好了,下一步该干什么事情了呢?好,下面呢,我们就将注意将我们的使菌注意听。
07:01
干什么写入到或者放入到吧,放入到我们bit buffer里面去,这个是不是很简单一件事情,前面我们就学过了吧,就是外buffer.put大家看put这个方法呢,实际上它用是方法的一个重载都有,那我们用哪一个呢?显在我们用这个比较合理,然后我们直接把string。他的字节全部拿到放进去了。也就是说,此时此刻,这句话一执行过后呢,同学们可以理解成这边就放入了我们的hello。三柜股,但是它是以字节形式放进去的。对,因为我们这是bit buffer嘛,写进去了,写进去下一步该干什么呢?是不是我们要准备把这个hello water放到我们写入到我们这个fire channel,但是你在写入的时候,此时此刻这个buffer根据刚才我们讲的是不是它的那个position已经指到了这个三硅谷的后边,因此你要反转,因为你现在由放入要改成从这个buffer名开始读了是不是好,所以说我们要进行反转。
08:07
对。Buffber败的buffer进行反转。进行反转,待会儿呢,我们可以呃debug一下哈,那就是把buffer点。呃。操作完了过后,这个操作完了过后,现在呢,我们就可以把这个buffer里面数据写入到。最近这句话啊,把这个buffer里面数据写入到这个China里面去,大家还记不记得怎么把buffer的数据写进去,用哪个方法,是不是用这个方法far China里面有个right方法。看看是是不是相当于说把缓冲区的数据写入到buffer这个buffer。就是相当于说把这个BY的buffer里面的数据写入到我这个缓冲区,呃,写入到我这个通道里面去,是不是,所以说呃,这是源目标是哪里呢?目标就是当前的这个通道。能理解吧,这个地方有点绕哦,因为你要不不认真听,就说对他来说是我对于我们操作来说,从这个buffer里面我们是读,但是对他来说呢,就是把这个我读到的数据写入到里面去。
09:13
所以这个方法就应该这样去调用,怎么调用呢?学校将。将这个bad buffer里面的数据,这个要把搞清楚,不然的话你听后面听着很郁闷的,将这个buffer的数据数据写入到。写入到China,就是我们的fair China。没问题吧,很简单,掉了一个方法呢,Far china.right。大家看,这就匹配上了,把bad buffer填进去就完事了。好,最后不要忘了一件事情,关闭我们的这个流,因为它真正最底层这个流还是它,你把这个关闭了,其他都通通关闭了,是不是这个道理啊,所关闭我们就留close一下。完事了。好,同学们,现在呢,我们来运行一下,看看能不能实现这个功能哈,待会呢,我们再debug,主要是这主要是这种反转发生什么事情,待会我们DEBUG1下来朋友们运行着。
10:11
嗯,运行一下吧。诶,这个运行错了,应该。运行到以前那个程序去了。啊,就不去观察啊,这是以前那个来我们运行一下。好的,那运行完了过后呢,我们打开我们的D盘,我们发现这边确实有一个文件是刚刚写进去的,打开它。是不是就是哈上硅谷?对不对就起来,那现在呢,老师主要是想去给大家看一下整个这个流程是怎么运行的来看,主要是在这下一个断点。我们在这儿下个断点哈。主要是看这个buffer这边是怎么处理的,来,同学们,我们DEBUG1把。第八过后呢,我们一步一步追,大家跟上老师思路。跑起来。跑起来过后,同学们看,其实这个string是哈上A股,那么fire传呢,现在fire传的里面现在还没有东西,是不是还没操作嘛,然后下面接着走。
11:11
大家看这个BAT buffer里面就有东西了,现在往上往这看。是不是在这里面这个现在这个分配了,是不是数据还没写进去,这句话22行还没执行,所以说他现在这个HB就这个BY的buffer关联的数组字节数组呢,现在是空的零。现在我往里面放执行,执行完了我们再来看是不是数据是10101041直到哪里呢?到这里为什么是写到14就没有了呢。大家知道为什么吗?你看啊,因为我们我们这个哈,你看有几个字节啊,H同学们看H呢,是一个字节。两个三个四个五个六个,好,这这就是六个了,再加上上柜谷,上轨谷,因为它是中文,中文的话按UTF81个中文对应三个字节,对不对,一个汉字嘛。
12:06
这点我就不用多说了,三三个自己,那现在就是呃,我看看啊。这边是123456,那再加六个。那应该等于12。啊九个啊加九个加九个对,因为你是三个汉字,那就三乘以三九等于15 15的话呢,它刚好就用到哪个地方呢,用到14,因为你下标从零开始编的没问题,好是这样子的,好现在呢,我们主要是看他几个标记,大家可以看到其实这个position到15啊,实际上呃,现在是用到了下标为14的。这个空间,那15是下一个准备操作的位置,但实际上15目前现在是没有放数据的啊呃,Limit呢,现在是1024,现在我们要开始读的时候呢,要开始反转往下走。
13:01
一反转过,我们看position就变成零了,而limit呢,变成15,就说待会你在从这个buffer里面取数据的时候,或者读数据的时候呢,你最多也就读到不不能超过15,因为limit是一个极限,其实就读到14,好,这个时候就写进去了,往下一执行代码就OK。就这样子的好。那关于。那关于这个第一个小案例,我们就说到这第一个小案例最重它的这个意义就是在于我们从这里呢,能看到整个一个数据的流流程,以及我们的NIO和原生,原生的这一个,呃,Java IO,它是一个怎样的关系,好,这个第一个案例呢,就给同学们先聊到这里。
我来说两句