00:00
大家好,我是海波老师,文件对象啊,咱们讲完了,那么基本的文件对象的操作呢,咱们也说了一下,那么接下来呢,咱们就讲一下文件的复制啊,咱们这里拷贝代码,把这个零二呢,我们改成零三,然后呢,把这个我们改成下划线啊,咱们叫做copy就可以了,然后点击OK,点击完成以后,把它里面的内容啊,咱们全给它去掉,咱不要了。那么不要了以后呢,把这去掉啊,咱们写上它,咱们就复制就可以了,那么写完以后呢,咱们说一下所谓的文件复制呢,其实啊,它就是将指定的文件内容给它复制到一个新的文件里面,对吧,就是这么个意思,那么咱们之前啊,给大家画图,咱们就说过了,我们的这个数据源呀,它可以是文件,咱们的这个目的地呢,也可以是文件,那如果你想通过Java代码来复制文件的话,就等同于我通过一个引用把这个数据源中的数据读取过来,然后呢,通过咱们的管道干嘛呢?诶一步一步走,通过管道一步一步走之后,大家看一看,我是不是就通过这个管道,诶,对了,有阀门对不对,你打开阀门以后让他通过这边,然后呢,再通过引用把它写到这个文件里面,这个不就叫文件复制吗?诶,所以啊,如果你能明白这个东西就好办了,那么就意味着我们在咱们Java程序当中,我们都有什么我们的一个文件的引用。
01:14
一个不够,那两个还有呢,我们的管道,那这个管道其实我们应该也有两个,为什么呢?一个是输入,一个是输出,对不对,哎,这个没有办法,这个呢我们还有阀门,不过这个呢,我们就一点点给大家讲就可以了,那首先按照我们刚才所讲的这个流程,咱们先创建两个文件对象。来吧,这里我们写上它。咱们叫做嗯,数据源啊,咱们叫数据源文件对象,好,然后呢,我们再写上它叫数据目的地。好了,我们现在呢,就有两个对象了,那么这两个对象呢,我就写成file,哎,不过呢,在写之前呢,我把这个异常呢,咱们给它取消,因为在咱们复制的过程当中啊,可能会有一些异常产生,我们这里需要给大家解释一下,所以呢,我就把那个异常我就去掉了啊那么好,接下来咱们接着写,咱们叫做file,这个呢,我写上一个叫s RC file,它表示的就是一个数据源的意思,所以呢,我们等于new我们的file就可以了。好,写完了之后呢,我们下面呢,再来一个,咱们叫做file,然后呢,我们叫做,诶,我们的这个file等于new咱们的file,行了,那这个就表示的是我们的目的地,诶我们都标红了吧,咱们前面讲过了啊,咱们的这个文件对象啊,是需要关联到咱们的系统文件的,你得给他个路径对不对,那咱们说了,就拿咱们这个word来进行复制,那所以呢,我们这里点击我们的copy,选择它的绝对路径,然后呢,给它复制一下。
02:37
这个呢,就是我们数据源的文件,我就想把这个文件给我复制过来,诶老师呀,那么你要把它放到哪去呢?诶我们也给它拷贝一下,拷贝拷贝以后我放过来,然后呢,干嘛呢,我们这里给他写上一个叫点叫copy。诶,老师,不对啊,这个文件不存在呀,没错,这个文件不存在,按理说我们是不是应该手动创建呀,我告诉你不用,为什么呢?因为咱们在流转的过程当中,我们的Java代码可以帮你自动生成这个文件,所以你的这个地方就不用管它了,所以这个地方我们需要注意,那么我们写上它叫自动生成文件叫自动生成好了,那么我们写完了以后,咱们回到这个图形当中,你会发现我们现在呢,两个引用是不是有了,那现在我就需要加管道了吧,一个叫输入,一个叫输出,那么这里给大家解释一下,我们在我们Java当中,我们的文件的一个输入,它有一个专门的流,咱们想它叫文件输入流。
03:31
啊,有这么一个管道对象,所以咱们叫管道对象好了,那么这里就写上叫file,它有一个叫input,有个叫stream,哎,你看看就是文件输入管道对象对不对,就这么个意思,然后呢,我们给他一个in啊,然后呢给他一个new,然后呢,把这个呢,我们拿过来,诶放过来,放过来以后咱们再来一个,哎,复制拷贝,拷贝以后什么意思呀,同学们,我们刚才看到了,我们这里除了一个输入以外,还有个输出吧,还有个out,那所以我们除了它以外还有一个叫输出流。
04:05
它也是一个管道对象,所以呢,我们这个应该改一下,我们应该叫out put,那这里我们复制一下,把这个放这儿,然后把这个地方我们放到它,那这个里面呢,我们全都是Java IO当中的啊,大家可以看到我们全都是Java IO包里面的这些对象。诶老师,那这里怎么标红了呢?很简单的,你看这个图,你是不是应该把咱们的这个管道跟这个数据流做对接呀,没错吧,那所以呢,我们这里大家看一下输入流应该跟我的数据源做对接嘛。没错吧,然后呢,我们的这个,嗯,输出嘛,应该跟这个目标做对接,诶所以拿过来这不就行了吗?诶老师怎么还标红啊,这里咱们就给大家解释一下它的这个地方呀,在咱们文件处理当中啊,可能会什么出问题,所以它会有异常发生,大家想想这不很正常吗?我们在数据传输的时候,这个管道炸了怎么办,对不对,它可能会有问题啊,那当然有异常了,这个是正常的,所以呢,我们这里呢,干嘛呢?我们给他拦啊,它有一个提示要让咱们增加track cat,所以我们这里加一下check cat。
05:07
好了,加完以后,我们把咱们的这个呢也放进去,因为它也会出现问题,所以咱们给它放过来,放过来以后啊,这里给大家解释一下,我们需要把这个对象呢,给它提出来啊,咱们给它提出来,给它一个,那然后呢,我们再把这个对象给它提出来,所以拷贝拷贝以后呢,我们放过来也给他一个捺,诶好了,然后呢,把这个地方我们去掉。把这个地方呢,我们也给它去掉,然后呢,把它我们放到这里来好了,诶老师你为什么要这么做呢?你这么做是什么意思,为什么把它的这个声明和它的复制给它挪开了呢。诶,那是因为我们后面的这个地方,我们要加一句话叫finally。这个是什么意思呢?给大家解释一下,是因为我们要对这个管道做处理,一旦发生了问题,我们是不是应该给它捕捉异常,这个咱们都学过吧,对不对?哎,异常的处理,但是呢,你要记住,当管道你用完之后,你是不是应该把这个管子给收起来呀,对不对?生活当中你说你把这个什么,我们的水放好了之后,你那个水管是不是应该收起来,我们这也是一样的,咱们这个呢,就不要收起来,咱们就叫关闭了啊,就跟那个阀门一样关起来对不对?所以呢,我们就写上它叫if,我们呢,这个样写上它叫做in,它不等于空,什么意思,你为空,它有可能出现空指针呢,诶,所以我们写上一个叫in,点我们的close,这个close就是关闭的意思啊,把那个管道呢,给我收起来,不过呢,它也有异常产生,所以呢,我们写上它,咱们叫做check,把它加上就可以了啊好了,那这么写完了以后,你的那个out其实是一回事啊,所以把这个呢,我们拷贝,拷贝之后呢,我们放过来,把这个改一下我们的out。
06:47
好了,那么这样的话,我们的基本代码呢,就算是写完了,那么我们写完了以后啊,这个同学们就要需要注意一下了,我们这个管道的这个地方,你把in和out你现在已经准备好了,那么我们该如何去使用呢?这个时候我们就要把阀门打开了,我先把咱们的左边的什么我们印的阀门打开,诶点一下,点完了以后,诶,我的水流啊,我的数据呢,就可以顺着这个阀门,顺着这个管道往下流了,那这个怎么体会呢?咱们说一下来写上它。
07:17
咱们叫打开。阀门。然后呢,我们叫做流转数据,那怎么做呀?诶有一个in点,有一个read这个方法呀,它叫读取,对不对,它叫读取,其实就打开的意思,把阀门打开,打开之后呢,我们点一下VR回车啊,这个时候这里就是我们的那个数据了,你把这个写上一个date就可以了,那么这里呢,它标红给大家解释一下,因为它有异常产生,所以呢,我们这里呢,就直接来,它会有一个我们的这边啊我们来这个呢,是一个什么呢?叫IO exception。就是我们IO的一个异常,因为你读数据嘛,就是我们的这个input嘛,那就可能会出问题,所以呢,我们这里呢,就把它改成IO exception就可以了啊,简化一点,简化一点以后,现在呢就可以了,诶你在这个地方把数据已经流转过来了,那么我们是不是就可以通过我们的输出把数据再流到文件当中去啊,所以大家可以看到我们接下来写上来,我们突突啊,咱们就打开阀门,然后呢我们流转数据,记住这两个流转是不一样的,一个是我们的输入流转。
08:25
一个呢,是我们的输出。对吧,那么我们的输入呢,就是把数据读过来,那我输出呢,就是把数据写进去嘛,所以我的out,我们点我们有一个叫做right,你把刚才读取的数据给我写进去,诶就可以了。同学们,我们现在的这个操作应该就完成了我文件的复制了,诶是不是这样啊,咱们验证一下啊,来把代码写完了,咱们运行一下右键。运行之后呢,我们来看结果,你看我们的控制台上没有任何的问题吧,咱们看看我们的左边是不是多了一个文件,叫做word.txt叫copy啊,这个文件是不是自动生成的,咱们看一看我这是不是自动生成了一个文件,就是这个意思啊,诶那咱们点一下。
09:10
点击之后有不对啊老师,咱们这个文件它里面叫hello啊,你的这个地方怎么只有一个H呢?这里就得给大家解释一下了,什么呢?我们当前给大家做的这个操作呀,其实没有问题,它是我们去读取数据,去写入数据,一个叫read,一个叫right,没问题吧,但是跟大家讲一下。我们的这个阀门啊,你不能打开时间太长。就好比什么呢,咱们水流一样,咱们拿着水管啊,咱们干嘛呢,往那个水桶里面去接水,那我就问你,你能这个阀门不断的开着,一直开着,那个水桶满了,你也一直开着吗?不可能吧,哎,也就意味着我们到达一个程度,这个阀门可能就关掉了,对不对,哎,就是这个道理,所以呢,我们这个阀门呢,它是怎么处理的呢?给大家解释一下啊,就是我们这个阀门呢,它是什么呢?打开一次它关一次,打开一次关一次,说的简单点就是说我们这个数据啊,来回来,我们假设呢,有三个数据或者两个吧,咱们两个数据。
10:10
这两个数据干什么呢?我先把阀门给我关上啊,咱们阀门关上,那现在干嘛呢?我去开开开了以后呢,这个A就流过来了,那么这个时候我们阀门就自动关上了,关上了以后,我的这个A呢,顺着管道往下流,往下流,往下流往下流以后,到了这以后这个阀门开开了,对吧?开开开开以后诶就往下走往下走往下走,往下走以后怎么办?诶就留到这儿了。大家有没有发现你A流过来了,那这个B呢?这个B好像没过来吧,为什么没过来,阀门关着嘛,对不对,阀门关着,所以从这个角度来讲的话,数据当然就不够了,对不对?那该怎么办?你再重复执行刚才的过程啊,你再把这个阀门打开,打开以后这个B不就流过来了吗?对不对,这个阀门就关上了,关上了以后,这个B顺着管道往下流,流着流着到了这儿的阀门一开啊一开,诶它不就流过来了吗?流过来以后,那我这个阀门一关,诶我们最后A和B不就行了吗?
11:10
大家能不能懂这个流程啊,如果你懂的话,那就好办了,为什么呢?因为我们的read就是打开读的阀门,我们的right就是打开写的阀门吧,那好,我们去多做几遍,大家看一下,我把这个拷贝拷贝以后大家看一下来,我们把这个right再拷贝。这样的话,我们又打开一次阀门,我们又打开一次阀门吗?诶,打开两次来拷贝,打开两次,我们这里再来三次,来四次,再来五次,你打开了阀门之后,每次打开一个数据,每次打开一个数据,那么大家想想,那是不是就是五条数据了,或者说五个字母了,那么这个时候你再执行的话,咱们的word里面是五个吗?那么这里面就应该可以了,来咱们试一试啊,把它关掉。关掉以后,我们这里呢,点击右键执行,执行以后呢,我们现在来看一看它的结果,咱们看看啊,咱们来打开。
12:01
有没有问题,同学们没问题吧,诶,所以啊,我们现在就完成了我们的文件的一个复制,诶,那么这个完成以后,大家会发现一些小的问题呀。什么叫小的问题呢?因为主体功能咱们现在是不是已经给大家写完了,那么你主体功能写完了以后,我们这里有些小的问题是什么呢?第一个有没有发现重复性比较强,你看这个代码是不是一样的,哎,就是这个意思,这是我们的第一个要给大家去说的一个问题啊,所以呢,我们这里说一下来我们的问题点出现了第一个我们的问题一。啊,代码重复性啊,咱们叫重复性比较强比较强是吧,那你这个就感觉有点麻烦嘛,哎,第二个问题,第二个什么问题呢?老师呀,那如果我现在我数据文件已经读完了。那我再去读怎么办?所以考呗。我如果现在我再去读,会出现什么情况呢?你想想总共就五个字母,我现在读了五遍,打开五次阀门,那么我写了五次,可是我现在有第六次,那么会出现什么情况,所以呢,这里给大家解释一下,就是说我们这里干嘛呢?我们现在多读啊,咱们叫多读数据。
13:15
如果你多读数据的话,那么会出现什么情况呢?所以我们运行一下看结果,运行以后来看看也没出问题,那么把这个文件咱们打开,打开以后诶。弹出个东西来,我们点击OK,怎么了?同学们有一个问号了,他看不懂了,他为什么看不懂啊,同学们,就是因为你读的有点问题了,哎,不对呀,没问题呀,对不对,我都读到了,那么这时候就得给大家解释一下了,我们第六次他读的是什么呢?你都读完了,那么你读的是什么呢?我们打印一下,打印以后大家观察一下,咱们最后这个读的是什么,所以我们运行一下看结果。运行以后看结果,你就会发现最后读的这个是负一,诶什么意思啊,同学们,这里咱们解释一下来。
14:02
突突,如果咱们的文件数据它已经全部读取完毕后,那么我们再去读数据啊,再去读取数据,那么读取的那结果就是负一。那就是负一,说的简单点就是无效数据,它就表示什么呢?它表示无效,或者说表示结尾,只要你读到的是负一,说明已经结尾了,没有新的东西了,就是这个概念,诶,那就简单了呀,如果你能明白这件事情的话,那么我们就给加判断了,写上if,我们这里呢,我们拿过来,我们想它叫date塔,如果它不等于负一。那么我们这里呢,给它放进去,你这么写不就行了吗?对不对,我这个就可以注掉了。好了,我们运行一下,运行以后看结果。那么这个时候呢,我们打开它还有错误吗?没有了,对不对,刚才是多了点东西吗?你刚才是把负一也写进去了,那你负一怎么展现出来呢?展现不出来对吗?哎,所以咱们刚才的问题呢,已经找到了,那行了,我们的这个问题,第二个问题咱们解决了。
15:08
那第一个问题咋解决啊,同学们,第一个问题代码的重复性比较强的,这个问题我们该如何解决呢?其实啊,我相信大家只要看到这个代码的话,稍微的也能感受出来,它都一样的。他既然都是一样的话,那么它的逻辑是什么呢?不就是说我们挨个读数据,但是就得加个判断了,如果你读到的数据是什么,是负一的话,就不再读了吧,所以咱把这个代码呢,咱们给它汇总在一块儿,咱们总结一下它的基本含义,不就是一个有条件的循环操作吗?而这个循环的不就是读取文件的内容吗?对不对,只要条件它达到了一个负一,那么就不再去读了,对不对?诶,基本的逻辑就应该是这样的。那好了,那如果基本的逻辑是这样的话,咱们把这个代码呢,咱们注释一下来,咱们注释。注释了以后,咱们能不能这样啊,咱们写一个叫while循环,咱们叫有条件的循环嘛,那这个well不就有条件了吗?那这个条件是什么呢?就是我的date,咱们括号咱们的date它等于in.read对吧?如果你不等于负一,什么意思,你就说明读到的是数据是有效的嘛,那么有效的话,咱们写它不就可以了吗?诶同学们你看看,就这么简单。
16:23
啊,就这么简单,你这么写就行了,来咱们再运行一下看一看。运行以后大家会发现没问题吧,咱们再打开,你看这不也是对的吗?哎,所以啊,我们这个代码啊,你可以写很多,但是麻烦嘛,咱们这么写也没问题,诶那既然这么写没问题的话,其实我们这一步是不是也可以简化了,为什么呢?他不也在做这个事情吗?所以咱们把前面的代码咱们也注掉,注掉以后我的这个地方就给它一个负一不就完事了吗?你这么写完了以后,那么我们在这个位置直接给他附上一个值,一读取诶就可以了。好了,我们代码呢,现在就写完了,文件的复制呢,我们就讲到这里了。
我来说两句