00:00
大家好,我是海波老师,文件的复制呢,咱们之前已经讲过了,那么接下来呢,咱们还是继续来讲讲这个文件的复制,那么之前咱们讲了所谓的文件复制呢,就是将数据源文件中的内容,它流转到数据目的地文件中就行了,里面所涉及到的文件对象啊,管道对象以及基本的流转过程呢,我们就不再重复了,那么我们这里呢,来拷贝代码啊,来拷贝,我们这里呢,把这个零三呢,咱们复制一下,咱们这里呢,把这个零三啊改成零五,然后写个下划线,咱们写个string,然后就OK。点击OK以后呢,把这些注释性的内容啊,咱们全删掉,保留的最基本的复制代码就可以了,把它都去掉,去掉以后呢,我们上面呢,就写上它,咱们写上一个叫字符串。那为什么写上字符串呢?就是因为我们之前从文件中复制数据内容直接就输出到指定文件当中了,中间并没有进行任何的处理,对吧?那如果我们想要对读取的数据进行处理的话,我们该怎么办呢?那回过头来咱们看看代码,我们的这段代码呢,其实啊,就是将读取的数据呢,给它写到文件当中,那么我们如果想要对读取的数据做处理的话,那么就需要在这个地方完成了,因为这个里面的date呢,就是我们每一次读取到的数据,那不过呀,你要想对数据做处理的话,咱们是不是应该先知道这个获取的值是什么呀?咱们这里啊,直接就把数据写进去了,你都不知道是什么对吧?那这里我们把这个注掉。
01:21
这里写上打印。现在呢,我们点击右键,我们执行一下,我们再确认一下,那这里呢,我们文件的内容呢,就是hello对吧,我们就是个单词hello嘛,我们这里呢,点击右键啊执行一下,咱们看一看。看一看以后,你会发现我们这个是hello啊,但是你打印在我们控制台上,其实不是,哎,是什么呢?它明明是一个单词,即使一个一个读取呢,也应该是五个英文字母吧,对不对?但是我们在控制台上,你会发现我们这里得到的是一个一个的什么我们的数字,哎,那不对呀,我们获取到的数据是什么呢?对不对,怎么是个数字呢?这里面不是一个一个的我们的字母吗?哎,这个问题呢,我们先放着这里啊,我们把这个我们的单词呢,咱们换成中文啊,咱们换成我们的这个汉字吧,咱们写成中国两个字吧,好不好?
02:11
写完了以后,我们再去执行打印一下,咱们再看看结果是什么,运行以后你会发现,诶,它还是数字,但是呢,这个数字你会发现。123456,现在有六个数字了,哎,你好,想想我们之前啊是hello,五个英文字母,然后打印五个数字,现在呢,是两个中文打印六个数字,那咱们得到的数据到底是什么呢?就是说你这里的这个date到底是什么?我相信啊,看到这个对应关系啊,五个字母五个数字,两个中文六个数字,相信大家应该能想到咱们之前讲到的那个Java的unode编码吧,还记得吗?咱们在重复一遍啊,在Java的unicode编码中啊,数字字母等可以使用阿克码来表示的字符啊,我们都会采用一个字节来表示,而我们的bit字节啊,是可以直接转换成int类型数字使用的,对吧?所以呢,咱们之前的hello呢,其实是五个英文拉丁字母,它也就是五个字节,那么控制台上也就打印了五个数字,对不对?那你可能会问了,诶,为什么阿斯克玛字符可以采用字节类型来表示呢?因为啊,阿斯克玛字符啊,在计算机存储时就是以BAT字节的方式存储的,每一个字符的取值都对应了BAT的一个正数,大家想想我们学的那个BAT。
03:27
它的取值范围是什么?是我们的负的128到我们的127对吗?那么其实我们的这个阿斯克码呢,就没有负数了,它就是从零是吧?我们的那个所谓的阿克码,它所对应的就是零,127,诶,恰恰呢,我们这个派可以存储这样的乘数对不对?对呀,它总共是我们的128个,我们的每一个正数就对应了一个字符,就是这个意思啊,那么对于常用的字符呢,128个基本上是够用的啊,因为数字啊,大小写的那个拉丁字母啦,还有一些简单的特殊符号,比如加减乘除之类的,总数不会太多,128个是肯定够了的,对不对?但是如果想要表示非拉丁文语言体系文字的话,比如说我们的亚洲文字呀,非洲文字呀,我们128个明显是不够的,所以计算机处理上啊,就会采用多个大于127的数字来组合表示其他语言的文字,那比方说我们的中文、韩文、日文等等,这些的文字都是需要组合生成的,而这个组合的过程呢,我们就称之为叫编码。
04:27
它是不同语言的组合方式呀,不尽相同,也就是说它的编码不相同,那么计算机处理起来就非常的麻烦,要经常对不同的语言进行转码,对不对?所以啊,Java为了统一不同语言的编码方式,所以统一的采用了unicode编码,就是这么来的啊,所以unicode编码呢,我们之前提过,我们这里再重复一下就行了啊,那么也就是说它统一的用三个字节来表示除了阿斯克玛以外的那些字符,所以呢,咱们的两个汉字呢,其实就变成了六个字节,对吧?一个汉字就是三个字节嘛,所以总共是六个,这是对的,而且他们的取值都是大于127的,没问题吧,哎,就是这个道理啊。好了,咱们明白了我们从文件中获取到的值到底是什么以后,就能明确的知道咱们之前所使用的Java读取文件时,其实就是一个字节一个字节读取的对不对,哎,所以啊,咱们这里的所谓的date就是一个字节一个字节。
05:20
哎,这些搞明白之后,那么想要进行一些简单的处理就比较容易了,那比方说我想把获取的值我加一,诶同学们看一下。我把这个值我们加一,首先我们这里的数值计算肯定没问题,对不对,但是呢,我们打印一下,咱们看一看,打印以后它的数字呢,就会每一个加一,对不对,没问题,但是如果我写到文件里面呢,咱把这个注掉,注掉以后咱们把它,诶这边我们也加一,我加一之后咱们看看,因为我刚才啊,咱们这里是中国两个字,现在呢,我去执行,执行以后如果在数值不变的情况下,它应该也是中国吧,但是现在你打开,打开以后怎么了?同学们,诶,我们看不懂了,对不对,为什么看不懂啊,是因为我们读取过的数据是不是做了改动了,那么你改动以后,我们新的那个字节,它组合成的文字我们就有点什么,诶看不懂了,就是这个道理啊,所以呢,我们这里呢,给大家稍微的咱们解释一下,那我们如果把这个汉字再改回到咱们之前的英文单词,会出现什么情况呢?所以把这个嗨,我再改回来。
06:22
回来以后我再重新执行一下。我们这里呢,重新打开点开,点开以后你看还是hello吗?不是了,我们的这个I是不是我们大写的H的下一个,我们那个F是不是我E的下一个,它等同于把那个我们之前的那个字母都增加了一个吧,哎,你看就这意思,所以我们不说了嘛,一个字节对应一个字母吧,你字节增加了,那么你的字母不也就加了一个一嘛,对不对?哎,就是这个道理啊,好了,基本的原理啊,咱们就先说到这里啊,那么咱们接下来要说的就是我们对数据做处理的时候,一般不会针对于每一个字节做处理,你这样的话太麻烦了,原理咱们讲清楚,但是我们实际用的时候并不会这么去用啊,这个大家要清楚啊,那你想想吧,如果文件中有1000个字节,那我每一个都这么做,你想想是不是很麻烦对不对?那既然麻烦,那我们一般都做什么样的处理呢?其实我们在实际开发当中,我们也是用来改变数据的值,但是我们不是一个一个改变,太麻烦了啊,那比如我们在当前这里不是hello吗?
07:24
那么我们对他做处理呢?我们就想在嗨的后面加个张三,我们怎么做?什么意思啊,我们在咱们的这个地方想把hello给我写到这个文件里面,我同时还想把张三也给它写进去,哎哟,那这个该怎么办呢?难道我们把那个张三也要改成我们的字节数字之后再给它放进去吗?对不对,那样的话就感觉太麻烦了,对不对?那该怎么办?哎,这里就需要用到我们之前讲过的一个字符串的对象,叫string builder,那构建字符串这么个对象,那之前说过了,所谓的字符串呢,其实就是多个字符组合在一起所形成的整体对象,对吧?那么Java中就可以使用使用builder很方便的生成和操作字符串,那么咱们这里啊,就准备创建一个我们的使用builder对象,所以呢,我们这里来。
08:10
我们写上它叫使string builder,然后呢,写个SS啊,等于new,咱们叫使string builder,写完了以后大家看一下我们现在啊,咱们的这个数据呢,我们先别给它存起来,我先往这个字串对象里面放拷贝,拷贝以后呢,我们来我们点一下叫这个叫追加,我们就把咱们读取到的数据给它放进去,你要记住啊,他们在这个追加啊,如果你把数字放进去,它就纯粹当成数字了,我们是要把我们当前的读取数据要当成字符啊,所以我们这里需要把它强制的转换成一个差类型,给它一个A,哎,你这么写就行了,你这么写完了以后,那么我们现在呢,我们在后面,诶我们就可以呢SS点我们叫什么呢?Aend,然后写个字符串,我们这个空格,咱们叫张三,诶,同学们看一下,我现在呢,不就把我们当前的这个字符串给它生成好了吗?现在呢,我们打印一下,打印我们的使用builder,我们现在运行,运行以后大家可以发现我们当前啊这个地方就已经叫hello张三了,这不就是我想要的吗?
09:11
诶,老师,那你得到它以后,你怎么把我们的这个数据写到文件当中呢?其实也简单,为什么?因为咱们之前讲过字符串是可以变成字节的吧,对不对,所以啊,这个地方我们写上它就是可以啊将我们的字符串转换成我们的字节数组,对吧?啊,咱们再将我们的这个数组中的啊中的每一个字节,每一个字节写入啊,写入到我们的文件中,那这样的话就可以了吗?我们这个呢,就不给大家一个一个演示了,为什么呢?因为我们这个演示起来就有点儿麻烦了,我们现在就告诉大家,从这个小例子呀,可以看出我们读取文件数据以后啊,其实最常做的就是字符串的操作,而不是一个一个字节的操作,那有没有什么好的办法可以帮助我们快速的进行这样的字符串操作呢?如果像咱们这样先转成字节数组,然后再将我们的数组中的每一个字节写到文件中,就会很麻烦,对不对?诶,所以那怎么办呢?这里呢,就需要给大家介绍Java IO中新的管道对象了,我们称之为叫字符流。
10:18
我们这种管道啊,在处理数据时,就不再是之前的读取一个字节在处理一个字节了,而是读取字节后转换为字符再做处理,而多个字符不就可以组合成字符串了嘛,对不对,好了,我们这里呢,把这个代码呢,我们稍微的复制一下,咱们换个新的,咱们这里拷贝,拷贝以后呢,我们还是写上它,咱们写个下划线一啊下划线一。点击完成以后里呢,我们大家看一下这种我们的流管道对象啊,它采用的是字节的方式做处理,所以呢,我们把这个去掉,我们写上它,咱们叫buffer啊,有一个叫buffer的reader。这个啊,顾名思义,它叫读取嘛,Reader嘛,它叫读取,所以它就是一个我们的输入流对象,我们还有一个叫什么呢?叫做print啊,咱们叫print writer,好,那我们写上它,咱们叫做writer,诶好了呢,诶老师呀,你这个地方为什么不叫after writer呢?其实我们这里也有,但是呢,我们会有相应的方法,会更简单,所以呢,我们这里介绍一个叫打印输出流啊,它的效果上是一样的,所以呢,我们这里说一下啊,咱们写上它,咱们叫字符啊输入流,这呢,我们写上它叫做字符,诶我们的输出流。
11:30
也是两个管道对象,这个写完了以后,把reader放过来,把这个writer放过来啊,放过来以后把这个它我们放这边,把这个print writeer我们放过来,这你要注意啊,咱们这里有点特殊,我们这里的buffer reader呢,它是需要传一个reader对象的,所以咱们写上它叫new,我们叫file reader其实也是一样的啊,就是通过字符的方式来读取文件,第一我们这里呢,可以把这个文件咱们拿过来。安过来以后,这个不用管它,这个是不用管它的,好了,那我们写完之后,我们最后呢,把它关一下。
12:04
把这个呢关掉,把这个呢我们关掉,然后我们把这个我们写上writer啊拿过来,过来以后在我们这边我们打开给我们打开,那打开以后同学们我们这块的准备工作就可以了,那么接下来我们这个地方需要稍微变一下,把它去掉。去掉以后,同学们,我们现在呀,已经不再是一个字节一个字节的了,而是我们以字符串的方式来读取数据,所以咱们这里写上一下来去掉。干嘛呢?就是我们读取文件中我们的一行数据。哎,我们说数据,这个数据呢,我们叫字符串,所以呢,我们这里接收的不再是一个一个的字节了,我写上它,咱们叫做string,叫做line。好呢,给他一个呢。个闹。非常是初始化的行的一个数据走窗,那么接下来呢,我们把这个line呢,我们放这里,我们把这个reader放过来,这样的话,我们读取的时候就不是在一个一个读了,要一读就是读一行read line,这个read line的返回结果就是一行的字符串,但咱们之前讲过呀,文件是存在最后的概念对不对,所以我们到底怎么判断,我们读字符串到了最后呢?诶,就是判断它是否为空,所以它如果不为空,说明你还有数据可以读,所以这个时候呢,我们就直接拿到它就可以了。
13:24
诶,那我下面该怎么写呢?下面也比较简单了,你的这个地方不是有一个叫writer吗?咱们就用这个writer,我们直接点一下,我们这里呢,写上一个叫做print,这个呢,我们直接把这个line放过来,别的你就不用管它了,把这个都去掉,去掉以后,哎,我把这边也都去掉了,好。最后我们再加一个方法,我们写上它叫做刷写。好了啊,刷野数据我们叫做writer啊,我们有一个它咱们叫做点我们的flash,这个flash什么意思呢?就是把我们内部的缓冲区的数据给它,全部给它强制输出到目的地,什么意思啊,咱们之前不提到过缓冲流的概念吗?缓冲流就是一个水桶一样,对不对,但是呀,我们之前的是装满了之后把水倒出去对不对,但是你要没有装满怎么办?所以从这个角度来讲的话,我们的这个flash呢,它就可以强制的没有满也给你倒出去来,就这意思啊,好了,我们把这个代码呢,就算是写完了,写完了以后我们就想看一看我们当前的程序有没有问题啊,后面这个地方呢,咱们改一下,把这个地方改一下,咱们的它去掉。
14:30
好了,我现在呢,把这个程序呢,我们就一块的来再看一看,哎,同学们看一下我们是嗨吧,对不对,然后呢,我们现在呢,就直接运行运行。运行以后看结果,你会发现我们复制的文件其实还是什么hello,没有任何问题,哎,老师,那这个确实比以前方便了很多呀,那咱们当前读取到数据是不是hello呢,还是说是我们的数字呢?咱们这里看一看啊,咱们打印一下咱们得到的植物串,我们写上一个line,然后呢,我们现在呢就运行。
15:01
哎,这时候你会发现我们得到的就是这一行,哎,老师呀,那如果有两行呢,比方说我再来个word,哎,我两行,那我两行之后你们看一看我运行,运行以后你就会发现它的这个地方就会有两个打印字符串,对不对,那咱们看结果吧,打开,诶,Hello word没有问题,所以啊,同学们,我们用这种方式就要比咱们之前要方便一些,尤其是我想对我读取的文件内容做处理的时候,这种方式会更方便,那么这个我们就称之为叫字节和字符的转换关系了,对不对,同学们,好了,咱们这个流啊,咱们就讲到这里。
我来说两句