00:00
我们之前光有一个缓冲区其实还是不够的呀,同学们,为什么呢?比方说我们一般情况下,我们是一个字节一个字节用的吗?不是,我们在实际的操作当中,我们一般是不是比方说读取文件的一行数据啊,那么一行一行读的话,跟我们这一个字节一个字节或者说有缓冲区这种方式是不是有点区别啊,而且咱们一行一行读的话,是不是应该是我们的字符流,而不是我们所谓的stream,就是我们的字节流对不对,所以这个就不一样了,好,那么我们这个来给大家看一看啊,咱们来拷贝,拷贝以后在我们的这个地方同学们看来。我们把这个呢,稍微的改一改,为什么要改呢?因为它的处理方式有点不一样了,咱们应该叫做什么呢?叫做reader对吧?那这里我们叫做in,或者叫做就叫in吧,也可以啊,那这个叫做in的话,那这个应该叫做我们的什么string,给他一个我们的nu啊,给一个nu,然后呢,这边我们就写上叫做什么呢?叫buffer的reader,应该叫buffer的reader了吧,Buffer的reader然后呢,里面是不是拿一个文件流呢?其实不是,因为我们的reader叫字符流,而这个叫stream,我们叫做字节流,字符流和字节流是不能直接组合的,为什么?因为你不知道多少个字节组成一个字符对不对,不同的字符编码它是没有办法做到的,所以怎么办?诶,我们需要一个叫转换流,在中间把字节转换成字符对不对,所以大家看一下,那么我们的代码的写法是不是应该怎么写啊,叫做new,我们叫input stream,我们应该有个叫做read。
01:38
然后干嘛呢?诶把咱们的这个我们的输入流给它拿到,然后呢,我们还要加一个,同学们不要忘记了,我们在这里面是需要加一个的,我们要在这里面来写个逗号,然后在后面啊来写上一个叫UTF杠八。什么意思啊,叫字符编码,我们的英文的字母啊,一个字节是一个字符,我们的亚洲文字中文啊,比方说我们的韩文日文呢,它是两个字节是一个字符,UTF杠八呢是三个字节,是一个字符,对不对?所以字节和字符的组合它是不一样的啊嗯,如果用错的话,就容易出现乱码了,对吗?那好,我们这个呢,先咱们这么写来。
02:21
写完了以后,大家会发现这个地方呢,应该叫做什么呢?叫red line,然后呢,它如果不等于空的情况下干嘛呢,把咱们的这个给它打印出来,对不对,我叫做S吧,咱们这叫叫做S啊就是这样的,好,这是我们的代码,那么我们图形该怎么画呢?所以大家看一下我们拷贝啊拷贝拷贝以后呢,我们复制一下啊,来咱们复制。那么我们放到这个位置吧,这个数据呢,比方说我们就叫ABC对吧?诶给它挪过来,比方说它是我们文件的一部分,那咱们这里呢,就不叫做buffer的input stream了,我们就叫什么呢?大家看一下,有一个叫做input stream reader吧,所以呢,来我们写上啊,咱们叫做input,嗯,In put stream啊,我们的ER,诶就是它好了,然后这个ABC我们现在暂时也就没有了啊好,诶放到这儿,然后呢,这个呢,我们把这个去掉吧,啊去掉接下来外面有个叫做什么呢?叫buffer的reader对不对,那好,我们在外面还得再加一层啊,哎,给它包起来对不对,诶就是这样啊。
03:26
好,那么给它放过来,这个颜色呢,咱们用一个蓝色来表示好了,那这个时候啊,同学们看啊,我们既然是叫buffer的reader,所以说这个地方应该有缓冲吧,诶,它叫做缓冲啊,所以把这个呢,再给它拉大一些放过来啊,咱们放到这个位置可以了,放过来以后,那么这个呢,我们拷贝啊拷贝,嗯,放过来,然后这个地方我们写上啊,咱们叫做buffer,诶缓冲区就是这样啊,行,那么我们现在呢,给大家来简单的我们看一看啊,来看一看放到这里,那这个怎么来执行呢?它的原理是什么样子呢?同学们看,首先它是要读取我们的数据,那么你要明白,同学们真正读取数据靠的不是reader,靠的不是我们这个叫input stream reader靠的是谁?就是里面最核心的file input stream,为什么呀?因为我们外面的绿色和蓝色,它其实就是一种包装,它提供了一些。
04:26
功能,但是核心没有变,核心的读取文件是不是还是fair input stream,对不对,就是它,所以这种感觉,它体现了一种我们的设计模式,这个设计模式我们称之为叫装饰者设计模式啊,这个有些有些同学听说过,对不对?咱们叫做什么呢?装饰者设计模式,所谓的装饰者设计模式,它就等同于啊,在原来的功能的基础之上,我们去扩展更丰富的功能,核心不变,我只是扩展了新的功能,这个就叫装饰者设计模式,我们的IO操作,记住啊,咱们的IO操作啊的这个操作就体现了装饰的设计模式,你像我们这边核心没变,还是由input来读取文件,那好,我的这个数据就被读到了,读到了以后这个时候怎么办?诶,他要往下来走对不对,他走到这个地方的时候。
05:26
住了,它就不能往下走了,为什么?因为它没有组成一个字符,所以这个A在这个时间点上,它是停在这儿了啊,停在这儿了怎么办?接着往下,往下以后是这个B了吧,所以第二个字节被它读过来,读过来以后它也放到了咱们的这个位置,对不对?哎,咱们叫做我们的转换,但是你要记住咱们用的是那个叫UTF杠八三个字节才能变成一个字符,所以我们接下来我们这个C,这个C我们来来来来来过来以后大家想一想,这个时候三个字节是不是够了了,以后怎么办,我要把它转换成一个字符了吧,比方说来把这个去掉,它就转换成了一个什么呢?中字。
06:14
诶,就转换成了一个中字,对不对,那这个时候呢,我们的颜色给它发生点变化,比方说紫色,那这个中字的话,是不是就可以干嘛呢?往下走了,诶往下走,往下走了以后,诶就到了缓冲区当中了,对不对,它不往下走,不去打印啊,同学们不去打印,那这个时候干嘛呢?又来一个字节,这个字节又来了,来了以后又放到了这个位置,然后呢,我们的B它又来了,来了以后他也放到了这儿,但是不够三个嘛,所以再来一个C,这个C被读取过来,读取过来以后大家看一下ABC3个字结构了,那这时候它又转换成了一个字符,对不对,所以把这个我们去掉,去掉,哎,它又转换成了一个字符,转换成了一个什么我们的国字。
07:00
诶好了,那么有了它以后,颜色我们也稍微变一下啊,变成了一个中文的字符,这个国字干嘛呀,诶就会发到缓冲区当中去啊,当我们的缓冲区数据越来越多,达到了它的阈值,它会一批来做处理,打印在控制台吧,所以这个我们的这两个字大家想想是不是就往这边挪呀,往这边挪,挪到这边以后就会在控制台上打印出中国两个字,对不对,这个呢,我们就啊来写上,我们叫做red line。好了,那我们现在大家可以看到就是这样的一个操作,这个就是我们的IO操作啊,诶老师,那你在这个处理过程当中,我们在一步一步的处理,我们说它属于一种装饰者的设计模式,那么我们前面的这些new,它有没有在执行咱们的这个数据的读取呢?我们说是没有的,就是你前面的这些操作呀,New啊,New啊,New啊,他们等同于在封装逻辑,什么意思啊,第一个它是读取文件,而是用来做转换,它是用来做缓冲,所以啊,它是把它的功能叠加在一起,实现了功能的补充,但是并没有真正的去操作数据,什么时候操作的,是你当真正想要用它的时候才会去读取数据,对不对?所以啊,咱们的这个read line方法就尤其重要了,他要触发我们的作业的执行,所以这种感觉有一个叫延迟加载的感觉。
08:31
或者叫延迟执行的感觉就是我们在new的过程当中,它只是建立了一个我们的连接,但是并没有真正的读取数据,对不对?所以啊,这是我们的IO的一个基本的处理方式,我们同学们要先把这个先搞明白好吗?
我来说两句