00:00
大家好,我是海波老师,文件的复制功能呢,咱们已经讲完了,那么咱们今天就说过了,我们所谓的文件复制呢,就是把我们数据源文件中的数据呢,干嘛呀给它诶复制过来,那么这里呢,我们首先呢,我们会读取一条数据,打开我们的阀门,把它读取过来,读取过来以后通过咱们的管道给它输出,那么这里还有阀门,把阀门打开,阀门打开以后呢,把数据输出到目的地当中。那么接下来呢,我们再去打开阀门,把这个B我们再读过来,对不对,读过来以后再通过管道再走到这边,然后呢,把阀门打开,再把这个B再输出过去,这就是一个最基本的文件复制的一个流程,我相信啊,这个咱们之前说过了,大家练习练习应该问题不大,但是啊,大家也会体会出来,这个效率好像不高吧,功能上没问题啊,但效率上不高,诶老师为什么效率不高呢?你想想我们这个文件当中啊,咱们打开咱们文件当中是不是只有五个字母啊。那这五个字母的话,大家想想,我们是一个字母一个字母读的,那么在这种情况下,我们这个读的阀门会读五次吧,我们写的这个阀门是不是会写五次,也就意味着打开了五加五是不是十次呀?我们想把数据拷贝完,我们再打开那么多的阀门,大家想想性能能高吗?不高吧,能不能优化一下,让它的这个复制的这个时间快一些,效率快一些,哎,其实是可以的,大家想想我们为什么效率低,是因为我打开一次阀门我只能读一个吧,那如果我们现在A和B,我打开一次阀门就直接能读两个的话,那我问你是不是在相同的数据的情况下,它的效率就快了,它的时间就短了吧,对不对?什么意思?我打开阀门以后干嘛呢?我先把A读过来,但是我先不往下走,我再把B给我读过来,这个时候我再把阀门关上,然后呢,我再把A和B什么呢?A再通过管道往下流,往下流的以后打开管道以后干嘛呀,我们直接干嘛给它输出过去,你说这样的话。
01:54
率是不是就比之前要高很多,什么意思?阀门我们只需要打开两次就可以了,之前两条数据是不是打开四次呀?诶,我们阀门打开的次数它少了,那么性能不就高了吗?哎呀,那这个说起来很简单,那怎么实现呢?这个呢就给大家解释一下,Java代码是可以实现这样的功能的,所以咱们把这个图形啊,咱们复制一下,复制以后咱们说一下我们Java中该如何实现它,其实很简单,我们需要增加特殊的管道,把我们的数据呢临时的存放起来,这个存放呢,我们就称之为叫缓冲区。
02:31
也就意味着我们现在都有个缓冲区来把数据临时的存起来,那这个呢,我就得加一个管道了,所以呢,我就需要把咱们之前的这个管道呢,我稍微变小一些啊,咱们变小一些,变小了以后呢,这个地方我们保持不变啊,咱们这个瘤啊保持不变,所以把这个东西呢,我放过来。好了,保持不变,以后呢,我复制一下,哎,对了,我们这个呢,也需要变小一些。所以啊,把咱们这个呢,给它变小一些啊,变小一些好,然后呢,把这个东西我们给它放过来,放过来以后同学们记住了,我的这个时候怎么办呢?我要拷贝一个管道,我这里要加一个,但是同学们千万注意了,我这里呢就不改颜色了啊,它的这个地方呢,我们就改一下,叫缓冲区,我们就叫八分。
03:14
缓冲区我们就叫buffer了啊,通过这个管道往缓冲区里面放东西,那同样道理啊,咱们这个地方呢,我们复制复制以后我们放过来也行,那这样的话我们它也是一个缓冲区,所以把它也起上八份就可以了。诶,我加两根管道,那这两根管道的作用何在?很简单,把数据呢,给我放到一个临时的存储空间当中,我们说了就叫缓冲区,咱们这里写上它。诶,把这个呢,我们放过来啊,放过来,放过来以后我就放到中间的这个位置,诶那么我们的数据大家看一下来,我们写上它把A和B拿过来,拿过来以后就按我刚才说的,我们这里的A打开管道以后往下走,往下走,但是呢,先不着急往后走干嘛呢,我先把它放到缓冲区里面,然后呢,我们再读去B,把这个B呢,我们再读过来,读过来以后我们再也放到缓冲区里面,那好管道给它关上,把这个阀门啊,阀门关上以后,我的缓冲区的A和B,它就顺着往下走,往下走以后,到了这里以后打开阀门,诶顺着阀门呢,他们就过来了,最终也就完成了文件的复制功能,诶所以它就显得非常重要,我这里呢,把颜色呢,我变成红色啊,醒目一些就可以了。
04:26
诶,我们的图形已经画完了,我相信啊,这个应该不难理解吧,性能应该是能够提高的,咱们代码该怎么写呢?咱们回来啊,把这个呢,我们复制一下,咱们拷贝,拷贝以后呢,把这个写上一个我们的四,然后呢,把这个写上一个下划线,咱们写上一个八分,然后呢,我们点击OK。点击完成以后呢,咱们这里呀,咱们加上一个,我们写上它叫缓冲啊缓冲,那么这里怎么理解呢?很简单,首先按我们的图形当中,我要加两个我们的管道,这两个管道要对接咱们的文件输入流和文件输出流,所以咱们复制,复制以后呢,我们把这个名字呀,咱们变一变,咱们就叫缓冲就可以了,咱们叫缓冲。
05:08
哎,可以了,那么可以了之后我们这个名字呀,它应该是叫buffer。啊8UFFER的就行了,然后呢,把这个名字我们改改叫8UFFER in啊八分in好了,把这个我们导入一下,咱们导入一下,然后接下来呢,把这个呢,我们复制,复制以后把这个in改成我们的out。诶,可以了,那这里呢,我们也写上叫八分out,哎,行了,那么你写完了以后,你得把这个对象真正的构建出来呀,所以我们这个八分in,诶咱们放到这里,放到这里以后把这个呢,我们它咱们拿过来,咱们new,诶好,你创建了管道以后,大家记住了,我们要对接咱们之前的管子呀,那么你之前的管子不就叫做我们的in吗?诶,放过来,还有呢,我们的buffer out,诶咱们放过来它等于咱们的new,然后呢,把咱们的这个咱们拷贝过来,好拷贝过来以后把咱们这个out咱们放过来,那这样的话,我的两个管道对象已经准备好了,你光准备管道对象还不够,你这里还有个缓冲区啊,啊,就跟水桶一样,对不对,所以呢,我们这里还得增加一个缓冲区啊,我们叫水桶啊,咱们叫缓冲区,咱们括号咱们叫水桶。
06:14
那怎么写呢?我们写上一个叫bit啊,咱们要读一个字节,一个字节读嘛,所以给它一个,它咱们叫BS或者叫cash吧,咱们等于new,咱们的bit,我们这个缓冲区里面存多少呢?诶咱们1024。就好比啊,咱们水桶装多少水,比方说五升啊六升啊,就这种感觉对不对,哎,我们1024就可以了,那好了,那你这么写完了以后,你最后要关闭的管道不就是缓冲区的这个地方吗?所以我们需要把这个管道给它关掉。关掉的时候呢,我们把这个给它关掉啊,关掉还有呢,我们的这个out呢,我们拿过来拷贝。拷贝以后我们放到这边啊,给它关掉就可以了,诶那我中间怎么读呢?你中间的这个读取的功能啊,你要是不改的话,它还是一个一个读嘛,对不对,所以我们现在读取的方式呢,我们采用的是缓冲区的方式去读,所以我们拷贝,拷贝以后我把它放到这里,记住了,这个时候我要把这个水桶放过来拷贝。
07:11
拷贝以后,这就意味着我们把我们读到的数据放到水桶当中去,对不对,就这意思诶,那么你放进去以后,那么我写的时候是不是应该把水桶里面的数据给我写过去啊,所以我们这样的写呢,用的也是它,诶拿过来,拿过来以后,那么我们的这个什么,诶缓冲区咱们拷贝放到这里就行了。那么你放到这里有一个问题啊,什么问题呢?这个水桶要是没满怎么办,对不对,也就意味着你的水桶有五升水,但是呢,你现在只放了三升水,你想把这三升水啊,也想给它写进去,行不行?可以啊,你就三升水,你不够五升,难道就不让你写了吗?也得写呀,所以呢,我们这里可以写个零,表示的是从头开始写,然后呢,我们写多少呢?我们就写你读了多少,咱们写多少,所以我们写个date,你这么写就行了。
08:01
行了以后大家会发现我这样的话就把缓冲区给它利用起来了,诶那样的话行不行呢?咱们试一试,我现在呢,我们来直接点击右键,咱们运行一下,运行之后大家会发现我们现在的这个地方其实也没问题,那么我们看这个文件点开,点开以后你看依然是对的,所以啊,我们这种方式从原理上来讲,确实应该比咱们之前的效率要高,对吗?这就是我们缓冲区的基本使用方式了。
我来说两句