00:00
接下来咱们看一看我们这个缓冲流。贷缓冲区的这个流。贷缓冲区的流我只讲这两个,这个和这个我就不讲了,各位只讲这两个啊,一样的。只不过这是字节方式,这个是字符方式。啊,我们重点来看一看,这两个有同学老师这个带八分的是什么意思。这是自带缓冲。使用这个流和这个流的时候,我们不需要BY的数组,也不需要什么呀,差数组。它不像这个file input file out,我们自己需要指定什么呀,Bad数组啊,或者是说我们指定这个差数组啊,是不是到了我们这个流这块呢,我们就不需要去指定这个bad数组,也不需要指定这个叉数组了,它这个流里边它自带。明白什么意思吧,它这两个里边自带的一个缓冲。自带缓冲啊,来一起看一下这个buffer的reader和bufferer,然后我们在讲解这两个流中的过程当中,我们可能会用到这两个流啊,我们一会儿再看,好吧,来我们先看看这个buffer的reader啊,Buffer的reader。
01:10
来,从这呢,我们去新建一个class,我们叫buffer reader。行吧,I buffer reader test。零一吧,哎,来一会儿看一下啊。叫做buffer的reader,带有缓冲区的叫做缓冲的字符输入流。啊,不需要使用这些流的时候,或者这个流吧,使用这个流的时候不需要。不需要自定义差数组,或者说不需要。自定义。数组。
02:00
自带缓冲啊,自带缓冲。那么这个流呢,我们可以研究一下啊,它的构造方法跟别的流有什么不一样的地方?来我们看一下啊,以B开始的叫做八分的。Reader。我们发现它的构造方法跟别的流不一样。别的流啊,上来就是在这块跟一个什么字符串文件的路径是不是,但是呢,到了buffer的reader之后,发现这个这个构造方法的参数啊,它是个reader参数。是一个reader。对吧,所以这块呢,咱们怎么去创建这个流呢。对吧,那这块这个代码该怎么写呢?思考一下,我们叫八分的。Reader。我们叫BR吧,假如说啊来,所有的异常我先不管了,各位啊,先扔出去了,在这儿放着行不行来。
03:00
所有异常不管了啊BR,那么这一块呢,我们要new一个什么呀,叫buffer的reader,但是buffer reader里边new的时候啊,它这需要一个什么呀,叫。Reader是不是?哎,尴尬了,Reader它是个抽象类。看。它是不是一个抽象类啊,抽象类没有办法实例化对象啊。但是有此类。对吧,它的子类我们刚才学了一个就叫什么叫这个fire reader。是不是,哎,这个file reader。这个类。它的副类是input stream reader input stream reader的副类是什么呀?哎,Reader,所以说我们的这个file reader呢,它就是一个reader,那既然是这样,那我能不能在这个地方我先new一个file reader呢,Reader reader new file reader,诶new这么一个reader出来,然后把参数给它传进去,行不行呢?可以可以各位啊,可以。
04:02
那么这块呢,我想说的是什么呢?是fire reader new reader,这是一个哎流吧,他是不是读某一个文件呀,读哪个文件我们看看啊。我们这个文件吧。copy02.java行不行?哎,就是呢,去读这个copy02.java的这个文件,读这个文件,那么把这个流创建出来之后,把它作为参数传给这个构造方法buffer的reader,哎,那么这里有一个特殊的概念,各位啊,特殊的概念什么概念呢?如果是构造方法里边需要一个流的话,那么。构造方法里边传的这个流被称为节点流。注意啊,注意有一个特殊的概念,各位啊,特殊的概念就是当一个流的构造方法中,当一个流的构造方法中需要一个流的时候。这个被传进来的流叫做节点流。
05:08
外部。负责包装的这个流叫做包装流。还有一个名字叫做。处理流,各位。注意啊。像当前,像当前这个程序来说,File reader。就是一个什么节点,流而八份的reader。就是一个包装流或者叫处理流,没有为啥,这只是起个名字,各位起个名字啊,不要多想。那么接下来我们用完之后要关闭流是不是,哎,我们来看这个流啊,它关闭只需要关闭最外层的就可以。
06:03
里边这个节点流不需要关,为什么呢?大家看啊,这个buffer reader是不是把reader传进去了。好。这个构造这个构造方法吧,是不是把这个reader,你看这个位置是不是一个fair reader对象啊,是不是传进去了,传进去是不是传给了这个构造啊好,这个构造方法大家看是不是把这个in这个reader又继续传给了这个in啊。好,这个in是什么?是不是buffer的reader的一个实例变量?这就是一个包装。啊,这是一个节点。你明白吗?就说我构造方法这块传的这个流是不是传进去了,用了一个流传进去之后,接下来这个流付给了谁,付给了这个属性。叫做in的这个属性,那么大家看一看我们buffer的reader这个流里面,注意听课啊,里边有没有一个方法叫close,我们发现close方法里边是不是in去掉了close啊。
07:07
所以大家想一想,当我们这个buffer的reader这个去关闭的时候,是不是里边这个它自动会关。这是源代码的分析呀,这个大家理解不理解呢。对吧,所以这个BR在close的时候,实际上它这个流会关闭,因为它会调close方法,而这个close方法在这里会去调in的close,而这个in是谁,这个in就是这个实例变量,而这个实例变量是你什么时候给它赋值啊哎,你通过构造方法给它赋值。所以这个流会关闭的,大家注意啊,对于包装流来说。需要关闭,只需要啊,只需要关闭最外层流就行。啊,里面的节点流会自动关闭。
08:01
啊,梁会自动关闭。可以看源代码,各位啊,可以看源代码,那么接下来有时老师咱们学这个干啥呀,之前流不挺好吗?这个流有什么好处呢?我们冲着它,其中这个方法我们也得学一学,大家注意看啊,这里有一个八分的跑哪了B开始的。八分的reader,大家看这里是不是有一个方法叫read?一读就读一行,你看见没?你看他可以读读一行。是吧,读取一个文本行,返回一个字符串,那么这个时候呢,我们可以尝试一下对吧?哎,读一行b.read line,读完这一行之后,我们来看这是第一行,对吧?来叫first line,我们走一下,你看它能不能读到。哎,你看。对吧,这怎么是这么一个东西啊。这是因为我们的是这个0.java文件。
09:03
这个copy02.java文件第一行,它就是这个。那么读到第二行应该是个空白吧?来,我们来看再读一行。嗯。这是不是第二行啊。第二行应该是什么也没有。对吧,第二行是什么也没有啊,然后紧接着再读第三行。对不对啊,来LA3第三行啊,Read LA read LA读完之后呢,我们,哎,看看第三行是个什么。行。第三行是他。对吧,哎,那有同学老师这个方法。什么时候结束啊?
10:01
什么时候算读完了?看看这个瑞德方法,各位。它这有返回值,是不是他说如果已经到达了这个文件的末尾,末尾and是不是the end of the stream,是不是已经到达了这个文件,或者这个流的末尾,它会返回一个none。那么这样的话,我们就可以对它进行循环了呀。是不是我们可以默认给一个文本行是空,然后让它去循环,只要它不等于空吧?谁不等于空啊,S吧,S等于什么呀?I点瑞德拉。一读读一行,读完这一行之后呢,返回的这个东西,只要是不是空,就代表读到了输出,对吧,我们执行一下,你看这种方式呢,可能会更先进,可能更更更快一些,你看。是吧,哎,可能更快一些,更快一些啊,它更方便吧,也不能说更快,各位啊,快的话应该是我们之前这些流更快一些,因为这个毕竟是包装了嘛,是不是,哎,所以说我们快的话应该还是前面这个速度快,只不过呢,就是说这个可能更方便一些,带缓冲区的话,我们不需要指定差数组,也不需要指定bad数组,自带缓冲,直接拗,拗完之后呢,把它包装进去,然后调用read这个方法一读读一行。
11:22
读一行。啊,读的这个注意啊,读一行这个它其实不带换行符啊。读的这一行数据,它是读到这儿。后边这个换行符他没读出来。云通老师,你咋知道的?来,咱把咱自己家的这个LN去掉行吧,把咱们自己家的这个LN是不是换行啊,把这个去掉,咱们来看看他是什么德行。好,大家看是不是在,你看这是不是一行。对吧,紧接着他又读了一行,然后呢,是不是输出了。是不是在这啊。又读了一行,是不是输出,输出是在这儿啊。
12:03
对不对。所以这个read line方法,它是读一个文本行,但不带最后的换行符。注意啊,b.read line方法读取一个文本行,但不带换行符。啊,不带换行符这个事要知道不带换行符啊。好了,那这样的话,咱们就把这个叫做buffer的reader这块咱们看了看啊,这的异常我就直接扔出去了啊各位你写的时候不要这样啊,我这是为了省懒劲儿对吧,我就扔出去了,你写的时候你要注意一下啊,最好不要这样写,一本正经的去写就行了,这里的点我再说一下各位啊,有一些概念是之前没有说过的,现在这个概念是什么呢?一个是这个叫节点流了,节点流传进这叫包装流。
13:00
包装流域叫处理流啊,然后呢,我们关的时候只需要关闭最外层这个流就行了,里边流不需要关,里边流它自动会关。啊,然后呢,这个主要在这演示一下,这个读读一行的事啊。
我来说两句