00:00
OK,那这样的话呢,咱们就把比较基本的这四个流呢,咱们就说清楚了。哎,这四个收精以后呢,其实非常具有具有这个代表意义了哈,然后呢,这儿呢是处理字符的,主要呢,使用它俩呢来处理字节了,然后呢,基于这四个流,咱们下面来看其他的一些处理流。处理流的话呢,我们说呢,就作用在现有的这种节点流之上的这种流,当然了,你可以在处理流的基础上呢,我们再包一层处理流也是OK的啊,那首先的话呢,我们讲其中的一个处理轴,这个呢称为呢叫缓冲流。缓冲流,缓冲什么意思?啊缓冲缓冲呢,就相当于它呢,在我们这个内存中呢,会有一定的这个缓存的这样一个场景啊OK啊行,那首先的话呢,我们把基本的这个框架呢,我拿过来就是这个框架啊CTRLC一下。诶,我就搬到这儿了,为什么要搬到这儿呢?咱们说呢,这个是处理油的一种啊。既然是处理流了,它就得作用在现有的流的基础之上了啊,那我们就作用在现有的这个文件流的基础上,所以呢,我在后边对应的咱们叫诶四个。
01:04
哎,叫做缓冲流。OK啊,这个呢,我们写叫处理流的啊一种啊好,那它既然呢是作用在现有的流的基础上呢,作用在谁之上呢,你看左边是谁,它就作用在谁上边,所以这块呢,它对应的呢,我们叫做buffer的是input stream。这块呢,又来了这四个,这四个话呢,其实很好记啊,大家呢,就把这里边儿这个fo呢,你替换成叫buffer的。就可以了。哎,Buff份的是吧,Output stream。哎,然后下边这个。Buffer的。啊,叫reader啊。Buffer writer。OK啊行,那么我这样写的话呢,实际上呢,你也就发现他们一一对应关系了,就是说我们后边呢,就处理流了,它得包着现有的一个流,包谁呢,就包他前边这个。
02:05
啊,你不能包错了啊,那从这个后缀上我们也能看到,这呢就是处理字符的一个输入流,它呢包的也得是一个字的输入流,所以自然而然的就包它了,这个呢就包这个啊,这个呢就包这个。这俩都得是一一对应的是吧。不能交叉啊,交叉那就坏事了。你看,比如你这是个file input stream,这呢是一个b reader,他那来处理字符呢,这处理字节的直接呢,让他去包他这个事儿是不对的。啊,就是说你这是个男生。啊,然后对应的这块呢,这是你女朋友是吧,这个是个男生。啊,这个呢,得是对应的,你这个女朋友你不能交叉吧。交叉就不太合适了是吧。嗯,这个事儿的话呢。哎呀,我上大学的时候呢,我们我是数学系了啊,我们那个有个物理系是吧,物理系呢认识一个朋友,然后他们说这个头毕业的时候很多呢,情侣就分了,这也正常签工作话呢,没牵到一起是吧,说他们这个戏呢,说有两对,说很特别哈,这两对呢,其实还是朋友关系,平时都一块儿出去玩,头毕业的时候分了,我说分了那有啥很正常,他说然后呢,又交叉了一下啊。
03:15
我说这个是真是挺厉害的是吧,换了换啊对象啊。嗯。主要呢,你换对象也还行,主要是平时四个人都很熟,你说一块出去玩一块干啥的,你说这个得多特别是吧。嗯。哎,这块拉回来啊,然后呢,我们这里边儿呢,一定是前后是这种对应关系啊,这个别整错了。哎,那自然而然的就意味着我们刚才提到的这个特点呢,也适用于这四个流了。诶,他俩呢,是用来处理字节的了,非文本文件啊,这俩呢,来处理字符的了,就是来处理文本文件的,好,那既然前面都已经能处理了,干什么还要引入这四个呢?自然而然的,我们要说使用缓冲流的一个作用是什么了。哎,缓冲刚才我们提到在内存中呢,它会提供一个叫缓存区啊,你想我们这个尤其是写出去的时候啊,大家你看我们要是把内存中数据往外写的话呢,实际上呢,是不是也要进行一次磁盘的交互了。
04:12
那你交互的次数越多,是不是花的时间就会越多了,所以他呢就会考虑呢,哎,比如说这块我们拿了1KB。这块你想给它交互,假如我们这个文件呢,有呃,这个叫100KB吧,那就意味着我们需要呢,给磁盘呢交互100次,把这个数据再写出去,然后呢,它这个buff,比如writer也好,Buff auto stream也好啊他在内存中呢,会建立一个缓存区,所以你先不要着急呢,给它写出去,你呢先把这e k be KB你先放到我这个里边。然后呢,达到一定程度之后呢,我一次性的给你写出去。这样呢,就减少了跟磁盘的一个交互了,说你暂存到这儿呢,这个内存中这个读写数据呢,会比较快的啊,所以呢,诶我们减少磁盘交互了,自然而然的这个速度呢,也就提升上来了,这个呢,就是咱们缓冲流啊,这个创建它的一个意义啊,所以呢,它的主要的作用呢,就是能够提升文件读写的效率。
05:06
诶这呢,就是它的一个这样的作用啊好,那也就意味着哈,如果我们这个文件呢,比较小的话,你像我们这个哈点天气,那你可能说看不出来这个效果,你用这个它俩这两个流。啊,还是使用这两流其实区别不大,但是一旦当这个文件比较大的。啊,几个G甚至更多的时候,我们使用这个缓冲流呢,它去读写数据呢,明显的这个速度呢,是要高于我们的文件流的。啊,那么就推荐呢,你使用这个缓冲流了。那么具体这块该怎么去做呢?哎,我们来看下这个细节啊,说四个缓冲流,首先处理非文本文件的。啊,那就是上边这两个,你一看后缀呢,其实也都知道啊。他俩呢,是来处理这个叫非文文件了,那处理文本文件呢,那就是下边这两个字符六。啊,这个就很清楚啊好,那么接下来呢,就涉及到这个方法,方法这块呢,其实基本上跟我们前面讲的这四个呢,也都是一样的哈,那个意味着这哥们儿呢,他的方法呢,叫read了是吧。
06:05
这个呢就读一个了,显然呢不太靠谱了,咱们是不是一读都读一个数组吧。哎,所以呢,这就是他的这个方法。好,那这个right呢,往下写。那写的话呢,咱们通常写出去的也就是你这个buff里边这个数据了,一般呢,咱们都是零到L音了是吧。这个没问题吧。咱们刚才讲这个流的时候,是不是也用的是这种方法。对的啊,好,然后下边这个reader writer,那按照我们上面这个套路的话呢,其实也是原封不动的,你给他拿过来这个呢,也原封不动的给他。哎,拿过来。嗯,拿过来以后呢,你把这个BAT呢改成叫呗。这个咱们也改个名叫c buff是吧。哎,这个写成大写也行啊,然后这个呢,改成一个叉。哎,这么着啊,然后这个呢,也是比如叫buffer这样子OK啊行嗯,这块的话呢,我们对于这个这个buffer呢,他们来讲的话呢,他除了能够去读一个差音数,读这个呢,跟我们前面这个呢,也是套路一样的啊之外呢,他还有一个特点呢,他可以呢一读呢读一行,所以这块呢,多一个方法叫read line啊。
07:14
对,他有个这样的方法来稍微的这个细节注意一下,读一行返回呢,就是一个字符串类型的。OK啊行,当然这块除了这个写出之外呢,还涉及到有一个刷新的一个问题啊,这块呢,咱们等一等去说啊行,那这呢四个流呢,我们摆到这儿了,那下边就得看一看,呃,那我们该如何呢去实现呢?啊,具体这个步骤是什么样的呢?啊,其实这块我把这个步骤呢,都已经放到这儿了啊,你会发现呢,跟咱们前边用的这几个文件流啊,套路是一样的了。来看一看啊。第一步和创建范围类对象啊,我这呢合成三步了哈,就把造对象的事呢,都放在一起了,造对象,造范围类对象,造流的对象。啊,你可能是文件流,还可能是缓冲流,但是因为缓冲流呢,我们这块呢,说一定要处理限流流,所以文件流还必须得造一下啊。
08:03
然后的话呢,第二步呢,就是使用缓冲流实现数据的一个读取和写出了。哎,这不我们刚才提到这样的这个方法吗。没问题啊好,然后最后呢,关闭资源。啊,你要说四步呢,你就把这两个流呢,哎,这个把不不一定是两个了啊,可能是四个流,把它呢放成第二步,这是第三步,这第四步。行完事了啊,那下边呢,咱们就来看看怎么来用了,来我这块呢,就写一个。哎,八分的我就简写了啊,叫做stream,哎,一个测试,所以这呢,我们只测试这个字节流啊。好,回过来。来这块呢,我们写一个啊,咱们呢就使用需求啊。使用的叫buffer的叫input stream。诶,还有呢,叫八份的这个稍微的长一些啊。
09:00
叫output stream。呃,来复制。一个图片吧。来做这样个需求,好,那么这块的话呢,咱们说这个过程啊,跟前面这个套路一样,只不过呢,是在我们前面用的叫file input和output基础之上呢,又造两个。所以为了体现呢,就是诶这块呢,就是在线的上面包一包,哎,我这么着啊。这样咱们找到咱们那块复制图片,这不就这个事吗。这呢是咱们写这个代码。注意看啊,我把这个代码呢,我CTRLC原封不动的,咱们粘过来。但是你看我这块主要都改哪些东西啊。好,从上往下走。啊,那么这块呢,我们看看怎么去改呢。哎,首先呢,咱们先这么着吧,把它先啊这个处理异常的这个事儿呢,咱们先给他简化一下啊。先整到最初的这个场景。把这块呢,我们也先删一下啊。
10:01
行control加L。啊,这么着啊,然后呢,这块我们把这个瘤呢,先给它再整过来。嗯,OK了啊行,这个呢,就是咱们一开始呢,使用这个file input file out stream的时候呢,进行读写操作是不就这样个过程嘛。好,这时候我们还没有处理异常了,咱们呢先从这个角度呢,接着往下去说啊,首先第一步说创建这个file类的这个对象这块呢没问题,咱们呢就写成叫COPY1了。啊,这有了,那第二个呢,叫创建相关的字节流,那再补一个还有呢,叫缓冲流。行,那么在你现有的这个文件流的基础之上呢,我呢再去包一层包这个缓冲流,所以呢,我再去接着创建。Buffer的叫input stream。哎,你一个。
11:03
哎,我就放进去了。好,接着啊,Buff的output stream。一个诶buff的,然后呢,TRL一下需要放一个典型的我们个就是它的一个了。哎,文章就发进去了。好,相当于呢,这不就体现为在我们现有的流的外边又包了一层嘛。好,包了一层之后,注意下边我们再去这个读写数据的时候呢,还是用的这个方法名参数类型也不变,但是此时呢,不是你这两个流去读写了。对,换成咱们的这个缓冲流。诶,就完事了。啊,比较简单啊,包一层改一下调用者,好,下边这块呢,涉及到资源的关闭了,好,那这块我们要看看这个事了啊。资源关闭的话呢,这块一下子是不是就四个流了。咱们前面说呢,你在同一个级别上的输入输出呢,说先关谁后关谁无所谓了,但是现在呢,又涉及到外层和内层吧。
12:01
对这块就有个要求了,哎,这个是内,这个是外,先关谁呢。那这块呢,注意咱们就先关外层。啊,你可以想着就跟穿衣服一样啊,先穿里边的衣服,再穿外边的,脱的话呢,先脱外边的是吧,这样去形象点理解啊好,那这块关的时候啊,所以我一般情况下关流都怎么着呢?哎,我就从下往上这块去关了,所以你从下往上自然而然的就先关外边后关里边了。所以这块我就先叫bos.close然后BS.close哎,我就这么着写了,然后呢,再去关上面这两个说这两个呢,是属于我们叫外层的流。嗯,它的一个关闭啊。啊,这个呢,我们叫诶内层的流的关闭。OKOK啊行,然后这块呢,要想我们主动去关,那就得是这样去关。但是啊,又加了个但是哈,但是怎么着呢,就是我们要是把外层流关的时候呢,内层流其实自动的也就关掉了,所以说这两个操作话呢,就可以不写了。
13:02
啊,所以这块我们再多加一句哈。说呢,由于啊外层流的这个关闭啊,也会啊,这个自动的。啊,这个对内层流。啊,内层的的流啊,进行这个关闭操作。哎,所以。啊,可以省略。内层流的关闭。OK啊,所以这块呢,我们这两个呢,你要写,你就先写外层,再写内层,那实际上呢,我们写了外层之后呢,内层呢,也就不用写了,是这个意思。OK,这块呢,我们就完事了,下边呢,我们来处理这个异常就行啊,处理异常的话呢,我要不我就省事一点得了,这个呢,大家其实应该知道我们应该用track find哈,诶,但是这个大家已经会写了,我就简单一点,我就在这去throw一个exception了。啊,就是这样呢,把这个步骤呢,留的比较清晰啊,诶大家知道是怎么回事,但是我这块我得写个注意是吧。
14:01
啊注意啊说词,呃是叫如下的这个操作呢。啊,还是应该来使用,叫拆开分类来处理啊。哎,处理异常行这块你可以理解成我偷懒了或者省事了啊,这样的话呢,我们不用包的话,大家更清晰的能够看到这样的几个步骤,行这个完了以后呢,我们看一下这个图片的复制,靠不靠谱啊,走起。那这个没问题,这个我们叫COPY1。啊,对应呢,是在我们的这个位置,咱们直接呢,回到咱们的磁盘文件啊,我们看看这个大小的这个场景啊。好,回来这个呢,首先看一下这个原文件,它的一个大小。那这个我们直接呢,把这个复制一份。啊,这是原文件的,然后看这个。哎属性哎原封不动的,你看大小都是一样的,所以我们这个复制行为呢,没问题啊,相对应的话呢,你这个双击打开。这个也都能OK啊,行,这就没有问题了。这呢,我们使用的是这个叫诶buffer的input stream和buffer的output stream复制一个图片。
15:06
行,那图片能复制完了,刚才提到了说缓冲流的作用呢,是能够提升我们文件的一个读写效率了,那我们要是只复制个图片,似乎呢,你看不出来说是不是更快了。所以下边呢,我们就要做个对比了。啊,做个对比啊,比如我们拿这两个流,咱们复制一个,比如视频吧。呃,然后呢,再拿这两个流,咱们也复制个视频,看看谁快。那这时候呢,自然而然的我们就知道了,你是不是能够提升这个读写的效率。没问题是吧,这个思路比较清晰啊好,那么咱们就把这个事儿呢。诶把这个事的话呢,咱们单独的比如写成一个,呃,具体一个文件吧,咱们呢,就称为呢叫copy file的一个测试了。啊,在这写啊这呢,我们是测试。啊,叫file input。Stream是它呢,加上。哎,File out stream这两个呢,这个复制文件。
16:03
啊,还有呢,我们叫B。Buff的是吧,Input stream。I buffer an output。啊,它呢,也是复制复制文件。来测试呢二者的一个效率。哎,效率问题啊,好这块你看我们怎么做啊,诶首先的话呢,我们先这块说明说使用。使用呢,我们叫buffer的input stream和他俩。哎,复制文件这个事儿的话呢,我们这样来做啊,诶我写成一个方法。那avoid我们叫copy。Fair with,咱们就说叫fair,我就简写了啊,Stream。哎,这么着。
17:00
然后呢,在这个位置呢,我们指明啊死类型的,我们src就是你这个文件的这个路径哈,Di啊,这个路径指定好以后呢,里边就有个复制行为,这个对应的操作呢,其实咱们在讲这个诶字节的时候啊,File的这个字节的时候,我们其实说过了哈。其实就是这个事儿吧。以它为一个基本的模板。哎,我CTRLC一下。啊,注意我这块粘过来啊,稍微的我们从上往下看一下,这个呢,是我们这两个流。然后呢,这块呢,把它呢改掉。换成咱们的src。哎,这样啊,然后呢,下边这个呢,改掉。换成我们的de,然后接呢把它装起来,这咱们的是个。没问题吧?这块就结束了,好,这呢是我们写的其中的一个方法,然后呢,咱们再来一个方法。这块那叫哎使用。叫buff的这两个呢,来复制这个文件。OK啊,行,下边我们来写这个方法,什么public。
18:03
A copy file。With,咱们叫buffer的。哎,我叫做了。哎,这么着啊,然后这个参数的话呢,是一样的,CTRLC粘过来。行,那么刚才呢,咱们也恰好呢,写了一个使用它俩呢,复制一个图片了,哎,对应这个代码是这咱把这个代码呢,也是给他,哎,这我就粘到这儿了,就啊CTRLC一下。诶,回过来放到这儿。好放这以后的话呢,我们下边这个呢,使用的是track catch,上边这块呢,诶为了防止说大家说诶是不是track edge跟los有什么呃处理上的时间的区别,那咱们上面呢,也给它用拆开式范来处理一下啊,所以呢,就从这儿到这儿,咱们给它包一下CTRL,再加个T。好,TRY开始翻一点。Printer。Stars。哎,然后这块呢,这块咱们就把。把这俩就直接删了就啊。
19:00
诶到这ctrl shift上哎移过来,然后这个呢,再单独的嗯,拆开一下。Print啊,Out,加回车。哎,回车啊。哎,这么着好,然后这个位置呢,我们再来个一是吧。哎,不等于。啊。哎,不等于闹。OK啊,行,CTRL再加个L。啊,精神精神啊,有同学开始要困了,坚持这一下啊。好,这个呢,咱们就写完了啊。就是问题没问题了是吧,然后呢,咱们这个视频文件呢,有可能也没有那么大啊,所以这块呢,咱们可以把这个单位呢,稍微的给它变小一点是吧,比如说就整个100吧。我整个50啊,这都行。哎,就是相当于呢,我们用这个字节的时候呢,你交互的次数越多,它这块时间会越慢,然后我们上面有缓冲了,就能凸显出来它越快了。
20:03
但只要有一点啊,你得让他俩得公平。对,你不能这块欺负人家这个file input说你这块来一个50,这块来个500,你这个车小,这个车大,那肯定不公平了哈,所以这块我们让这个各个条件都一样,唯独呢,就是用的这个流呢有区别。这块我们可以稍微把它调小一点。好,俩方法写完了,下边不就是测试的事吗?哎,测试一下,我们具体呢,就是spend这个time了。好,这块我们来写啊,首先一上来system,第2CURRENT time minutes是吧,记录一下这个开始时间。啊,然后呢,我们再复制一份叫结束时间。哎,中间呢,咱们就放这个方法的调用就行是吧。好,比如我们来一个死针形的叫src啊,这个我们写一个路径啊,死针形的叫DT啊,这这写个路径,然后就调我们下边的方法,另外以后的话呢,我们看一下花费的这个时间。
21:01
哎,时间为,哎加上一下。啊,这个我们用N减去这个是吧,就妥了啊好,那咱们先调一下下边这个吧。来调这个方法啊,CTRLC。把它拿过来这呢,使用我们这个叫字节流了啊。嗯,这呢,把src放进来,Dit放进来,哎就妥了啊,然后呢,我们得把这俩路径呢写上,写谁呢。咱们得找一个视频了。对应的咱们这个视频。嗯,找一个咱们复习的视频。这两个分开的是吧。复习的视频呢,咱们这个时间应该会稍微的长一点是吧。好,就以这个为例吧,CTRLC。这儿呢,我放到桌面上了。改改名,比如就要零一杠。这就一个叫视频了。就它啊好,然后呢,把这个首先这么着,属性它的一个位置CTRLC。
22:00
这个放到这儿啊,这呢有个名。Ctrl a ctrl c。哎,这么着啊好,接着呢,把这个呢CTRLC一下,咱们再粘过来,这个呢,我改成叫零二吧。嗯,可以了啊好,然后呢,对它呢,进行一个复制操作,发布的时间为,诶。脱了啊,哎,我们就直接run了。那这个你得稍微再等一会儿是吧。哎,可以喝口水啊。好出来了啊,那么这时候这个复制呢,我们花费了11秒多啊。这个是我们用的这个方法。嗯,11秒多,哎,稍微的我们也看一下这个视频呢,复制的对不对啊,这呢是这个文件的一个大小。那这呢,是复制好以后的这个大小往上走一下看一样是吧。好,那说明我们这个复制呢,没啥问题啊,这个我就不用打开看了,接着的话呢,把它换掉。
23:05
诶把这换掉啊,换成咱们的这个方法。换那个啊。同样呢,我们把这个src来放进来,De呢放进来,然后这个时候呢,你可以把它改成比如叫零三吧。诶,再换一个名啊,这个零二改零三,这个应该不至于说这块差很多吧。是吧,这就是一个名而已啊。行了,然后这时候我们看看这个呢,花费的这个时间是多少,哎,直接呢,我们走起啊。有点太快了是吧。快的让我们担心的他这块是不是不靠谱,F5刷新一下。还真不靠谱是吧?Copy fair with buffer。这个呢,我们看咱们这个代码啊。哎,Buff for的STEM这块没问题是吧。这个没改。啊,刚才大家白激动了是吧,说这也太快了啊,Src是吧。
24:04
嗯。马上是吧,好回过来啊,这个有点激动了啊,哎,这时我们再重新再转一下。啊,也还行是吧,诶不到一秒钟。哎,412,然后回过来看一看,哎,这时候有了看看大小。属性。哎,这是它的一个大小。啊盯一下,然后再把这个。看一下一样是吧。诶,这呢,我就不用打开看了啊,这个没啥问题啊,你看这个它有个缩略图,你也能看出来没啥问题了,行,那明显能看到我们使用这个缓冲流啊,确实这个速度呢是要快一些的啊,那这块它怎么做的呢?其实就是我说的啊,他把这个数据呢,在读入写出的时候,它有一个缓冲,他在内存中呢,其实建了一个数组,大家如果你要看这个对应的源码的时候呢,就能够看到它这里边一个叫默认的一个全局,呃,全局的一个变量是吧,这变量你可以去调了啊,但一般呢,我们也不改了,叫默认的一个buffer的一个size叫8192。
25:02
实际上呢,就是1024乘以八。就是8192言YG呢,这呢是不是就是8KB啊。对,相当于呢,他在内存中默认的建的这个缓冲那个大小呢,就是8KB。其实大家你也可以试着呢,你说那就是不是意味着我要使用这个,我要是把这个数组成个幺二,诶是不是有可能差不太多呢。啊,其实呢,是会差不太多。嗯,所以这块呢,你知道它大体的这样一个原理是什么了啊。行,那咱们关于这两个流呢,咱们就先说到这儿啊,通过这个呢,咱们去证明一下它的一个作用。然后接下来的话呢,咱们看一下这俩流,呃,因为这俩流里边呢,咱们不是说新增加了一个方法了吗?嗯,把这块呢,我们稍微提一下啊,然后这块的话呢,叫buff reader buffer啊这个咱们都知道来处理这个字符的啊,咱们对应的就是处理文本文件的了。文本文件的话呢,这块我们这个内容比较少,咱们诶拿一个现成的,比如说在咱们这一章的课件里边,这个叫数据源,数据源这块呢,我们就看这个吧。
26:05
哎,DBCP_UTF杠八啊,CTRLC1下回过来这块呢,我把它粘到咱们当前这个module下啊TRLV。哎,这就粘过来了啊,粘过来以后呢,是不是就放在我们的这个位置了。在这是吧,双击打开,呃,因为呢,这个文件呢,通过我这个名字呢,你也能看到它就是UTF8这样的一个,呃,相当于保存的时候呢,使用的是这样的一个字数集了,所以这块我们在打开的时候呢,这块也使用的是U片八,所以呢正常显示这都没问题。行,那现在呢,我们针对于这个文件呢,咱们使用一下buff的reader,然后就读到内存当中了啊,你在内存中呢,想看,那我们就打印到控制台上,如果呢,你想给它传输出去呢,我们再用一下B的reer呢,给大再写出去就可以了,好,这块我们来看一下这两个流的一个使用。OK,新建一个文件。Buffer的,我们叫做reader。Writer是吧,关于他的这个测试了啊好在这儿我们可以写一下。
27:00
哎,测试。Buffer的reader。哎,和。哎,Buffer的writer OK啊,它的一个使用,咱们这张呢,涉及到这个流啊比较多,但是大家呢,始终呢,你得占到一定的这个高度哈,你往下去看,但这个代码呢,其实整个的处理的流程呢,都是类似的套路呢,都差不多啊。这块呢,首先我们写一个代码。这个代码的话呢,咱们就先针对于这个buff reader的一个使用呢,我们做个说明,比如说我们现在呢,把刚才呢,提到这个文件的内容啊,读到咱们这个控制台上。哎,就是这样的情况。说呢使用哎buffer the reader说将咱们刚才提到说这个文件。啊,这个中的这个内容显示在我们的控制台上,OK,行,这呢就使用这个buffer reader就可以了,首先的话呢,我们去提供这样的一个文件啊,这个我们可以诶。File哎,你有一个具体的一个file这块呢,我们就直接呢写上这样一个文件就可以了,这呢是一个相对路径,OK,然后下边呢,我们去创建一个叫file reader啊file reader呢,在使用我们这个buffer的reader去包一下,诶那其实呢,我们也可以写成个匿名对象的方式了,比如就这样了啊,Buffer的我们叫reader了。
28:13
就他啊,然后new一个buffer的一个reader,然后这呢,我们就直接呢,去new一个叫file reader。哎,我就直接这样了,然后把我们这个file呢给它扔进来。你看就这样的方式,甚至说的话呢,我们这个file的话呢,因为也就用这一次了,所以你也可以呢,把这个CTRLC一下,直接替换了我们这个有名的这个file了,这是不是也行。诶这呢就相当于一行代码,我们把这个流啊,跟我们这个文件呢,相应的就都创建成功了啊也可以啊,这个大家根据需要呢去写,我这呢,比如说暂且就还写成一个file了。啊,这呢,你可以整个呢,看作是我们第一步也行,就创建文件创建流,哎搞定了,下一步就是我们具体这个读写的一个过程啊这呢,因为我们只涉及到这个读,诶没有这个写。OK啊。好,那么这儿呢,我们先说一下,这个叫方式一哈,这个是我们读取的过程。
29:03
诶,这个方式一,方式一呢,就是我们刚才提到了,说它呢,可以还以传统的这种差形数组的方式来去读,还可以呢,就是读一行,咱们方式一的话呢,就是先啊读到这个差形数组里边,哎,这是这种方式,所以呢,这样的话呢,我们还得需要呢去定一个啊。C阿尔法。诶,一个具体的一个叉类型的,比如这个长度呢,我们就还写成1024了。In的一个L音啊,这个我们说过了啊,它呢来记录每次。读入到啊,咱们这个C。Buff啊,中。的这个啊,字符的一个个数啊好这呢还是一个外循环。哎,进来,然后L1呢,就等于B2.ra。诶到咱们这个ACB当中,然后呢,返回一下呢,就是它的长度,哎,如果呢,要不等于负一。在这呢,表示呢,你每次呢,读进去这个内容了没有到这个文件的末尾,这呢,我们就把它呢直接显示到这个控制台上了,显示控制台上的话呢,我们就针对这个查询数字呢,进行一个遍历就可以了,所以变历的话呢,啊只便利LN这么长。
30:06
这样呢,其实又涉及到两种方式,一种呢,就咱们前面讲过的啊,In一个I呢等于个零,I呢就小于是不是Lin呢。对啊,爱家家。这块我们直接来个输出换行了就不要了,这呢就是ACB。写个I这是不是就可以了啊,这个呢,也可以看作是我们这个叫方式一上面叫方式呢,咱们这个叫方法吧。这叫方法一啊,这个呢,我们把它替换掉,当然呢,也可以这样写。哎,方法二啊,哎,这呢,我们直接呢,整一个string啊。哎,这会我们去new一个string,然后呢,把我们这个CB呢放进来0L。对,相当于把这个数据先放在这个字符串里边,然后我们呢,去打印一下这个字符串是吧,这个也可以啊。行,这个呢,叫方法二了。嗯,OK,但是这块你要注意我们这个string的话呢,你用的构造器你不能用这个哈。你要用这个构造器的话呢,其实就类似于我们这个L呢,你写成是它的一个了是吧。
31:03
对,就相当于把这个字符串,那字符数组里边这个所有内容都读到这个词string了,不合适,因为咱们前面说过呢,你读进去几个,你就读出来几个是吧,所以这块呢,不能用这个构造器啊,得用我们这个构造器。啊这呢是这个方式二,然后呢一顿read啊,Read完以后呢,我们最后呢,就可以去关闭资源了啊,这个B2点我们做一个这个close的操作,那内部呢,我们这个流的话呢,就也不用再去关了,也自动的会关掉啊,所以写成匿名了也没啥问题啊。好,这呢,就是我们说的这样一个过程。啊就完事了,然后相应的异常的话呢,肯定还是用拆开番类来处理啊,这块我就呃简单来处理了啊,咱就写这个叫Rose吧。那把它呢,放的稍微的大一点啊,其实这个IO的就行啊。好,这块还是那意思啊,应该用开翻的啊,我这就可以省事了啊,好,那么这时候我们再去做一个run。哎,大家看一下这时候呢,你看现在我们这个数据呢,这不就读到我们这个。诶,内存当中我们给大家显示出来了,就跟我们这里边儿那个提供的这个文件呢,你看是一样的这个效果啊。
32:06
行,这个呢,就是我们说的叫buffer的reader啊,咱们来写的这样一个情况啊,这呢是我们说的叫方式一了,然后呢,我把整个这一块呢,给大家注释一下。哎,助教了啊,就针对我们这个读取的过程,还有一个方式二。哎,这个方式二的话呢,就使用我们这个课件里边提到了,它呢还可以呢,叫read line。哎,一读呢,读一行。诶读一行啊读一行这块呢,我们也需要呢多次呢去读,所以呢,我提前呢把它读完以后得到的,比如这个叫字串了,或者写成这个data也行哈,诶我先声明出来,然后这块呢,我就写个well。然后还是类似的哈,这个data呢,怎么着呢,然后我们B2点去瑞。你看读一行是吧,读一行把读到的这个数据呢,给到我们这个死锥形的这个data的变量。那我们就得判断怎么着算是结尾了呢?是吧,这个呢,我们看下这个read line这个方法啊,点进来这个方法呢,反问这是个string,我们看下这个returns哈,说呢,呃,一个string,它包含了你当前这一行的这个内容。
33:09
但是你看这块细节啊,说它呢,是不包含任何的换行符的。所以这时候这个瑞呢,它读一行,这一行里边呢,是不包括最后的这个换行符的。啊有这么个特点啊行,这个呢,我们心里边清楚,然后哈所呢或者呢是no说如果呢,你这个流呢,已经啊到这个末尾了,它返回的是个no,所以呢,我们这时候就判断一下你是不是no来确定呢,我们这个文件呢,是不是到末尾了。也就是说,当你要不是闹的时候。那就说明呢,你这里边儿是有内容的了。对,有内容它本身就个string呢,那咱们就直接呢,把它就输出到这个控制台,这趟这块输出的时候,注意咱们上边这个输入的时候呢,其实都没有带这个换这个LN啊,就相当于你要是换行你就自动换行了,那咱们这块可能也想那我就也不带了。但是我们要不在的时候呢,最后这个关,哎,我们就要想一个事儿了。是不是你看这个效果啊。
34:02
是不是就写到一行上去了?对,因为呢,他在读这一行数据的时候,他是没有换行的哈。诶,那我们这块呢,是不是得自己呢,主动给他,比如说你在这个位置给他补一个。哎,换行符是吧。那这时候呢,它就有这个换行的一个效果了。啊,这个注意一下啊,你看这时候就行了。好,这个呢,就是我们说的这个叫,呃,关于buffer的reader啊,它特有的一个方法,我们需要关注一下,叫read。这样的情况。好,这个呢,我们在这写上啊说呢每次呢读取一行。哎,文本中的数据。哎的这个数据啊,然后注意呢,返回的这个字符串。诶是不包含这个换行符的。诶OK啊行,这个呢,就我们给大家要强调的这样个点了,好,那这个说完之后呢,咱们接着来说一下,此时呢,我们演示的只是一个buffer的reader了,咱们下边的话呢,Buffer reader和writer呢,咱们合在一起给它用一下,那就呢,可以实现一个文本文件的一个复制操作了啊。
35:13
使用。Buffer的是吧。reader和。Buffer writer。哎,说实现一个文本文件的一个复制是吧,OK啊。来,我们再写一个这个代码了啊。好,那这边要写的话呢,还是我们这样几个步骤,所以整个这一章呢,都是这个套路啊,这呢我就简写了,就是造文件。大刘。是吧,哎,这呢,我们看成是第一步了啊,所以呢,首先把这个文件呢,先整出来,比如说FILE1啊,你有一个具体的file。咱们呢,就还拿这个文件来说吧。CTRL一下。哎,粘过来好,然后呢,CTRLD复制一份。这个我们呢,叫它的一个下划线,就叫COPY1这样啊。
36:00
好,这呢是文件了,然后造流流呢,咱们就合并在一起吧。B2,哎,你有一个八分的一个reader,哎,你有一个具体的file reader。哎,这么着,然后呢,把我们这个FILE1诶扔进来。好拖拉,没问题啊,Buffer writer。哎,这么着啊。你这个叫B,你一个叫。然后呢,二。行,这个都清楚吧。是包一层呗。嗯,好,然后第二步呢,就是文件的一个读写操作啊。好,然后这个文件读写操的话呢,咱们刚才提到了,其实有主要是看读了啊,读的话呢,你要是使用的是这个插形数组,那我这时候写的时候呢,处理的也就是插型数组了。呃,你要这块读的时候呢,是一个字符串,我们写的时候呢,就也是字符串了,所以这块主要看读了啊,那这块咱们既然讲了这个,那咱们就以re烂咱们说一下啊,所以这块呢,我们就可以呢,诶首先string类型的,比如我们这个叫data了啊声明一下,然后well。
37:04
然后这块塔等于B2.ra的烂,诶要这个啊说呢不等于no。好,这就进来了,进来以后的话呢,我们使用这个BW点去write write的话呢,诶我们原来的话呢,相当于你用的是这个方法了。那现在用哪一个呢?就用这个就行。哎,我就read read的时候呢,我们就把你这个data里边,你读这一行,这一行长了那就长了,短了那就短了,哎,我把它那写出去。那写出去的话呢,同样大家要小心个事儿哈。他呢,是不是没有这个跨行的操作吧。对的,没换好,那暂且的咱们比如说没加,咱看看这个效果啊,好,那么你再读一行再写出去,再读一行再写出去,好这块呢就完事了,最后呢是个no就结束了,下边关闭资源。OK啊,所以这个你就从下往上看啊close,然后B2点呢去close一下就行,那既然呢,涉及到这个资源的一个关闭了,所以说还得使用track。这块我就又省个事儿啊,那咱就呢去一下。
38:03
那就这样了啊,但是我在这块还最好得说一下啊,说注意。啊,说这个开发中是吧。啊,还是需要呢使用。哎,踹。哎,Catch啊,Finally来处理一场啊。来处理这个瘤的这个异常。行这块呢,我就相当于给省事了啊好,这个呢,这样的话呢,大家也更清楚的能够看到呢,就这几个标准的步骤。来我们在这儿,在这儿呢,你可以再加一句话哈,这个我们叫复制成功。啊,现在这块呢,也打印到我们控制台上了啊,上面这个数据的话呢,是输入到我们这个文件里了,来走起。好,复制成功。那那这块我们看一下这个文件啊,所以呢,就是这个呗,诶双击打开,诶这呢跟我们想的是一样的,因为呢,咱们这个read line的时候呢,它就没有换行这个行为了,所以呢就整到一行上去了。啊,就成这么着了啊,那怎么办呢?
39:04
对这块呢,一种方式的话呢,就是我们自己主动的,呃,因为你不是这个data里边呢,不包括这个发行嘛,我们就给他主动的补上一个是吧。这样的情况来,我们这时候呢,再去做个run。哎,可以了啊,然后呢,再把我们这个文件打开。那这种案例文件是不是就有这个换行了。没问题,OK啊行这呢是我们说的一种操作方式啊,或者的话呢,就是我这块呢,不主动的去加这个,哎,换行了,然后呢,在我们这个。啊,Buffer writer里边呢,它有一个方法啊,就是一个叫new。那就这个。哎,它表示呢,就是一个换行操作啊。哎,那这块呢,还是把它给write出去了,相对呢,就是跟我们刚才那个写法呢是类似的,只不过这个操作呢,它可以体现这种跨平台的一个效果了,不同的平台下呢,都表示的这个换行的操作好,那类似呢,我们去run一下呢,在咱们Windows里边呢,跟咱们自己写个杠N呢是一样的啊,所以这块你看这个效果呢,也是一样的。哎,就这样个情况。
40:01
OK啊好,那这块的话呢,借着这个操作呢,我稍微的再多说一个方法。啊,读是一个方法,这个方法的话呢,在咱们前面啊,其实讲的这个file input stream out stream的时候呢,其实也有这样的一个操作什么呀,你看我们这块呢,就是读写是吧,然后这块呢,是我们用的最基础的啊,这是回到咱们前面了,这不是咱们最基础的几个流嘛。哎,这些流的话呢,你看这个fos在这个位置呢,其实它还有一个什么方法呢,叫做flash。是吧,你看从这块儿呢,它其实就有是吧,然后这个flash翻译过来呢,叫做刷新的意思。那刷新是要干什么呀?是吧,诶这块呢,我就不写到这儿了,就相当于从其实最开始的时候就有哈,咱们至今呢都还没有掉过,然后在这块的话呢,诶我们稍微的说一下,那就类似呢,你看它也有这个方法叫做flash了。哎,我就写到这了啊,这个呢叫刷新的一个方法。这个方法的作用是什么呢?就是每当。
41:03
哎,每当调用此方法时,哎,就会主动的。哎,将我们说的内存中的这个数据啊写出到哎磁盘文件中。啊,就是相当于我们这块调一个flash,这时候就把你这一行的数据呢,给你写出去了。相当于我们在内存中呢,一开始这个数据不是都在这缓存着,包括我们这个B,然后B这个input,包括我们前面讲的那几个文件流哈,他们都有这样的方法。哎,说这个刷新。有必要写吗?啊,这个呢,你看这样来讲哈,就是如果说呢,我们要没有写的时候。哎,我这是不是没写啊。我没有写的时候呢,诶这块呢,我们是不是也有这个资源的一个关闭操作啊,就是我要没有写它,咱们刚才演示的不都没写吗?没写它的时候呢,如果我们这个呢,也没有写了。
42:01
现在我这流是不是也没关呀。OK啊,比如没有关的时候呢,这块呢,就可能会出现一些数据的缺失情况,比如说这呢是我们当前的这个文件,我把这个文件呢删一下吧。啊,这个我们就读paper啊,删掉了,删掉以后的话呢,这块卡我们再去做一个run哈。哎,这呢,就复制成功了啊,复制成功以后的话呢,得到了这样的一个文件,这个文件我们打开一下。你发现这怎么没有数据呢?看是不是有这样情况。这个呢情况呢,就是由于呢,咱们这个数据的话呢,为什么我们刚才没有加这个方法的时候呢,这块也对呢,因为我们最后关闭了嘛。我们在关闭的时候呢,其实内存中的数据呢,肯定就写出去了。啊,当然呢,你说我们要是这个资源没有关,呃,那这块呢,你要是也没有刷新,那这个数据你发现了,你看没有是吧?呃,然后在这种情况下呢,如果我们还是没关,你把这个刷新的你给它打开。你看这时候我们再来一遍啊。哎,这个呢,也要复制成功,然后把这个文件再打开看它就有。
43:03
啊,这个想说是什么意思呢,就是说我们其实呢,在这个资源关闭的时候。呃,资源关闭的时候呢,它这个内存中的这个相应的一些数据呢,都会给我们刷新出去啊,写到文件里边啊,那如果说你希望呢,在这个文件的执行的过程当中啊,及时性的呢,把这个数据呢,也给大家刷新出去,你就加个他。你要没有加他的话呢,如果要有这个close的行为那也行,因为在关闭的时候呢,数据也会刷新出去。呃,如果你要希望在执行过程当中及时的去刷新呢,你就调一下这个方法也行。OK啊,这个呢,就是我们说的flash的一个操作啊,OK。行,这个呢,我们就以咱们这个八份的这个缓冲流呢,把这个方法呢,稍微的提了一下,好,那么回过来,诶这里边的话呢,我们再看一下这几个流哈,诶对于我们这块这个操作呢,主要的特别之处就它有一个叫read量的一个操作了,哎,它返回的是一个死菌类型的一个字串了,然后对应的话呢,这俩是对应的,然后跟后边这个呢,它就有一个啊我们可以呢去write的时候呢,就是把这个字串的信息呢给它写出去。
44:05
诶有这样的一个方法跟这个呢去对应,然后呢,刚才我们也提到了,提到了啊,然后在这块呢,这不还有一个刚才提到的方法叫做flash,诶这个大家了解一下啊,然后上边这类似呢,也都有。还flash行,前面呢,我们讲的这个流呢,其实都有,如果你要这个流正常也都能关闭操作执行的话呢,这个flash呢,其实也可以不用写了,如果你希望呢,过程当中呢,也及时的去刷新,你就把这个flash呢都加上就OK了啊好,那么通过我们刚才呢讲的这样的一些操作呢,大家需要掌握的就是缓冲流啊,它的主要的作用是什么,什么时候我们会去用,主要呢,就是这个文件比较大的时候呢,如果我们去读写,建议呢,使用缓冲流,如果这个文件比较小了。那其实你用不用呢,都不明显,那你还可以使用这个文件流也OK。就可以了。
我来说两句