00:00
好,那这呢咱们就过了,那接下来呢,咱们就落地呢,开始写这个代码啊,写代码的话呢,咱们首先关注的呢,叫做接电流,先讲这四个啊,那这四个里边呢,咱们先讲字节呢,还是先讲字符呢,其实先讲谁后讲谁呢都可以,这块呢我就先讲字符了啊,为什么呢?因为咱们那会儿也稍微提了一下啊,就是这个字符的话呢,就是操作的基本单位呢,就是一个一个的字符,这个字符呢,比较形象嘛,咱们都能看得懂,所以呢,咱们先来讲它,你要操作它俩的操作图片,就很难说的很细说这是一个字节,这是一个字节,我们又不能深入到这个图片里边去看那个二进制了,是吧,所以咱们呢,就先以这个字符来给大家讲解,那讲解这个字符的话呢,我们就涉及到去操作这个文件了啊,那这块呢,我在注意啊,我在当前这个model下,我去新建一个具体的文件。文件呢?不妨我就叫做hello第2T了。哎,这个文件里边呢,我们也写简单的一点数据哈,我就叫做hard word,哎,就写这两个数据啊,回过来现在的话呢,我们想通过这个,因为这是个文件了,里边呢,写在这不都一个一个都是一个字符吧,那咱们就用字符流来操作它一下啊,那咱们就先来讲这俩,讲这俩我们现在写代码的话呢,注意啊,我现在是把它写在当前的Mo下了。
01:22
哎,如果我们要以相对路径来获取它的话呢,是不是大家你得去用这个单元测试了,这要小心点,咱们复习的时候说过这个事儿了,哎,咱们先来测试一下叫这个file的一个reader的使用。关于它你看这个单一测试在每一个module当中,咱们都需要呢,给大家去导一下,所以说呢,这是单一测试归我们具体一个module所有,所以我们下边呢,我如果这块呢,定一个file,哎,用一个file先呢,这样我们去导一下啊。哎,这个时候呢,我把它呢CTRLC。这样写的,这呢是一个相对路径,这个相对路径呢,咱们是相较于当前module下的,相较于哎当前这个mole,哎这样子啊,那如果呢,大家你这块写成是一个没方法了啊。
02:18
这个你要注意一下,这个我就怕有同学呢写成没方法,最后呢,调的时候出问题了,你要写成没方法的话呢,你想表示它怎么办啊。就是首先呢,你要是这样写的啊,如果你要是还是跟我们下边这个单元测试里边一样的写法,这个呢,你要注意它是相较于对相对于咱们这个叫当前这个工程啊,哎,这样提的,相对当这个工程去提的这个,我们看看能不能看到它这个。这个路径哈,file.get absut pass是吧?哎,我们执行一下当前这个没方法了啊。没方法的。
03:00
你看是不是相信咱们当前这个工程啊,诶这要注意啊,诶后边呢,我们要写流,你操作的话呢,这样写你你明明写在model下了,但是你操作的是当前工程下,它会报那个文件找不到啊的一个异常,那如果说呢,我们现在就想用这个没方法,我呢还想表示的是它怎么办,咱不是讲了好几个构造期吗。啊,或者说你就还用这个,还用上面这个构造器也可以,那我们就怎么着,在当前这个路径下,其实呢,你可以直接呢,就嗯写一个谁啊,我就写个Z09下的这个CTRLC这样。Get pass,就是这呢,不是相较于默认,咱们说在没方法里边相较单线工程吗?单列工程下不有一个叫D09吗?啊D09下边再找他呗。不是这意思。哎,咱们这个代码呢,我这边都写到这了,默认呢是相应它下边了,那你就在它下边呢,找这个D09 D09下边去找这个hello啊就OK啊,来这块我们再你看执行一下我们这个妹。
04:12
哎,这不就对零九项了吗?哎,就是大家呢,如果说哎这个你要用的没方法,你就这样写,哎你要是在单元测试里边呢,你就这样写就OK了啊好,那咱们就以这个单元测试为例,我去说这个事了,那现在呢,我们有一个文件,我现在想做的事呢,在这描述一下,说将咱们说这个叫呃对零九。啊下的叫hello,第2T这个文件内容读入内存,或者要读入我们这个程序中,哎,并输出到控制台,就是咱们在这控制台里边,你看一下这个hello word把这个几个字符呢,都给它输出出来,啊做这样的一个事情,行,那我们开始怎么去做,那既然呢,你要把这个内容呢,读到我们这个程序里边,那咱们肯定是要用流了,那流的话呢,你得知道我这个流操作的是谁,所以第一个点呢,咱们首先呢,你得先实例化我们这个file类的对象。
05:14
看实例化file类的对象,然后指明咱们要操作的文件。哎,指明我们要操作文件,好,这呢是第一步了,那第二步文件也有了,下边是不是该去造这个流了。哎,那我们去,呃,提供具体的这个流啊,就是留了一个实例化了啊,那咱们现在呢,操作的是一个文本文件啊,那我们这个数据呢,都是以一个字符一个字符的方式去读的,诶现在呢,你是想从这个硬盘当中把数据读到我们这个程序或者叫内存里边,所以呢,诶,嗯,首先用的是一个字符流,其次呢,还得是一个输入的好file reader,不妨呢,我就要F2了,哎,等于new一个叫file reader,好control out斜杠这个里边呢,我们可以填一下这个file的一个路径,或者呢直接写一个file,咱们呢就先写这个file了啊。
06:12
这样。诶,这时候抛异常,咱们暂时呢al enter先让它先一下啊这呢我们就提供具体的这个流了。就相当于你现在这个文件是它,然后咱们现在整了一个管道就上去了,管道怼上去了,怼上去以后希望这块呢出数据,下边你你这个管要是有个开关,把这个开关拧开,这个水呢就流过来了,那下边呢就是具体的来操作这个数据了,哎就是数据的一个,哎读入过程。做这个事儿,那数据怎么读呢?咱们去看一下我们这个file reader,它的这个API的话,你会发现呢,它里边我们操作这个文件读入的话呢,用的方法都叫做read。啊,都叫做read,那我现在写这个read的时候,你会发现它有很多重载的方法啊,那咱们呢,先用一个最基本的,就是空参的,先用最基本的啊叫空参的,那首先al enter这个呢,也会抛异常,咱们先让它抛出去,其次的话呢,这个读入我们al enter一下呢,接收为一个值,那这个值的话呢,是什么意思,那就得看一篇了,后面往这一放,等这个一秒,呃,一秒钟就出来了,咱们之前设置过啊,那如果大家如果你要没设置过,你点一下F2也行。
07:28
啊,就直接能看到了,这里边呢,返回值到底是什么意思呢?看这个returns说呢,返回的就是你我当当前这个读入的一个字符。字符读入的这个字符,或者说呢,返回的是负一,如果呢,呃,你对应的这个流是吧,已经达到这个N了。啊,我返回叫负一什么意思啊,就是说呢,我们文件呢,你读读读,我们肯定是要用循环了啊,哎,这个呢方法首先呢,它表示读的是一个字符,那这个文件呢,可能有很多的字符,我们就得用循环,那么循环的终止条件呢,就是说诶你这个文件读完了,文件读完从这儿呢就能看出来,就是如果这个方法返回的叫负一,表示的就是读完了,哎,所以这个方法呢,我们这块标示一下它的一个作用啊,这个是比较重要的啊read的方法空三的说它呢返回读入的一个字符啊,然后呢,这是它说如果呢达到。
08:30
说文件末尾了啊,它就能返回负一,那这呢相当于咱们读入了一个字符,只不过这个字符的话呢,应该是一个叉类型的,但是我们看到它是一个int类型。那咱们不是也讲过,说这个叉类型不也对应了一个int这个值嘛,就是这个小A,不就是97嘛,对,相当于这块呢,Int呢,是以int的值的方式存在这个97存在这个A啊哎,这样行,那这呢是读了一个,那读了一个数据到底有没有有可能这个文件呢,什么也没写,那相当于上来是不是就是负一啊,所以我们下面呢,需要判断,又因为呢,你可能会有好多的字数要读,所以我用一个啊Y循环说这个data塔呢,我判断是不是负一,如果你要不是负一,相当于是读这个数据了,读完以后呢,咱们不是想给它输输出出来啊,哎,我这写data,但这时候你写data塔的话呢。
09:26
你要真要这个小A是不是就成97了,那咱们是不是在前面给它加上一个差呗。这样。嗯,这呢是读了一个啊,你是不是接着得读下一个呀,就像咱们说那个迭代器一样啊,你掉了一个next方法,下边还有呢,是不是还得再调next,不停的掉next,所以我们在这个位置呢,你再去这个还用这个data就行啊,再让这个F2呢,再去read一下。就相当于我们原来写循环里边这个爱加加一样啊,就在里边写了再读一个,再读一个呢,你看读的这个呢,是不是一个负一,不是负一,再输出输出一个再读一个。
10:05
相当于我们每次读的时候呢,是不是你你就相当于我们这个迭代器啊,这个指针是不是也自动就下下移,或者叫这个右移也行是吧?哎,文件呢,就一个一个往后这样去读了啊成这样的话呢,我们通过一个循环,只要呢,你最后发现是负一了,说明呢就到文件末尾了,好搞定。并并且呢,我们输出到控制台上,那还有没有所谓的后续知识呢。对不就是说读出来吗?哎也读出来了,按说呢没了,但其实呢,大家不要忘了,这边有一个四就是哎叫流的关闭操作,这个呢是一定要注意加上的,千万不要忘了啊,这个呢,我们流就是file reader,给他呢调一下close方法。这里边就提到这个流必须呢,咱们手动的去做一个close才行啊,我在咱们这一章这块呢,这不是放了一个涉及到垃圾回收这个说明,垃圾回收呢,咱们以前说过,说GM呢,它有个自动垃圾回收机制,说呢你不用这个东西呢,都给你回收了,但是呢,这里边儿有一句说明,说对于这些物理上的连接,比如说呢,像数据库连接以后,我们会讲到输入输出流这个socket网络连接的时候呢,用到它这些资源,咱们GVM是无能为力。
11:26
它不会给你断开的啊,因为你这涉及到物理上的一些连接了,那这些资源呢,需要我们手动的去做一个关闭,有的人呢,叫什么shut down啊,这上叫close啊等等,方法名可能不一样,但是它的意思一样,需要我们手动的关闭资源。啊,否则的话,那个资源没有关闭啊,容易导致这个内存的泄露问题啊好这呢,咱们就做了一个关闭,那这个代码呢,就小了,先跑一下看看这个效果。你看这不就出来了,哎,只不过之后你看他这个,每次咱们输出一个让他换行了,就别让他换行了再来。
12:08
你看你看这hello又出来了,这时候呢意义非常大,我们此时呢,是把一个硬盘中文件中的内容读入到咱们这个这个内存里了,啊,这不就内存里边一个一个的data,咱们为了方便起见,咱们就给它输出了一下,让大家看了看。哎,这呢,就是我们做的这样一个问题啊,实现了读取硬盘中文件的一个操作啊,就好比是大家比如说你都有手机,手机的话呢,你打开你这个联系人的应用,你一打开你会发现诶谁谁谁什么电话号码,谁谁谁什么电话号码,你把那个手机关机了,你再打开,还有。那这时候这些数据呢,肯定不会是始终保存在内存里的啊,他呢,就把你这个联系人的数据呢,都写到一个文件中了。啊,可以是一个TXT,只不过这种读的时候不好读啊,它可能呢,诶是一个叉猫格式的文件,我就写到这个文件里,当然了也可以放到具体的数据库当中啊,不管是怎么着吧,是吧,那假设呢,我们是放到这个叉包格式的文件里了,那么大家一点开这个应用的时候,它是不是就去读这个文件中的内容给你呈现出来了啊相当于这不就是从这个文件当中,我们把这个数据呢,加载到内存里边,诶帮你呢,都显示出来了。
13:20
哎,就是做的类似于我们现在这样的一个事情啊好,这个呢就算写好了,写好以后呢,做一个小的优化啊,嗯,这里边呢,你会发现这呢写了一个read,这呢又写了个read,感觉稍微有点重复啊,我们呢简单的给它注释一下啊,这个其实都谈不上说这个叫方式一了。谈不上方式一其实呢,它俩类似啊,只是我这样写的话呢,就让你知道这两种其实嗯都可以,其实没有没有什么大的变化,方式二怎么着呢?嗯,咱们呢,也是这个定一个data,哎,我就先放到这儿,然后呢,我这样写啊,大家看能不能看得懂,在这里边我们呢先对先给这个data塔呢,做一个负值data塔呢,就是这个F2点去read。
14:09
对,入列到我们这个电塔里边,接着呢,看这个电塔是不是负一。不是负一做这样的操作,操作完以后啊,按说呢,还得有这个操作,只不过这个操作我们写到while里了。就相当于把这两个合成一个,这是语法上的一个修改啊,谈不上说这个效率上的一个修改。哎,语法上,哎针对于呃,方式一的一个啊修改这俩呢,写哪个都行,这个呢就是少一行代码而已啊,这个能看懂吧,行这个呢就说完这个事了啊,那么接下来呢,再说一个问题,大家看这呢,是不是要留着关闭啊,这个关闭操作的话呢,我们说一定要写不能丢了,但是刚才呢,也看到我们在写代码的时候,这个位置和这个RA的这个位置啊,好像都出过异常,那我把这异常呢,现在是s Rose给他干掉。
15:04
干掉以后大家会发现这个位置爆爆问题了,这个报了,这个也爆了,这个都是异常了哈,既然都是异常,我们现在要考虑就是这个处理的方式到底是用throws还是应该用try catch finally啊说在这个里边有区别吗?有区别咱们刚才用的相当于Rose是吧?Roses好不好呀?不好,为什么,哎对你看如果说我们这个位置走下来没有抛,异常假设没有抛啊没有抛,那意味着这个流是不是就创建好了。那穿越号以后往下走,这个位置调read的时候呢,有时候可能会导致这个阻塞的出现,始终这个数据读不过来,他那就抛了一个IO的exception,相当于出现异常了。一旦出现异常,咱们说就会在这个位置呢,创建一个IO exception的一个对象了,这个对象的话呢,默认情况下啊,它其实这个咱们是一个运行时异常啊,默认情况下呢,它就抛出去了,相当于我们这个程序后边呢就不执行了。
16:09
你要真要这样,相当于这个流呢,是不是就没有关啊,这就资源的这个就浪费了。啊,存在这种泄露问题,所以呢,咱们希望呢,就是我上面这个流造好以后,即使你这块出现read的异常,咱们也要保证这个流的资源呢,要能够执行关闭操作。啊,那么像这种一定要执行的操作,对咱们用finally放,所以这块呢,咱们就不要用throws去处理异常啊,用try catch finally,那怎么做呢?啊,我们就从这一直是报到这儿啊这个呢叫out shift z出来这个TRY开放里点一下,哎,他就把咱们刚才写的这个代码呢,就都放到我们这个TRY里了。啊,自动的还把这个file reader呢,给我们放上边了,是因为你刚才没有包这个file reader,你要用吗?它自动的就给你放外边了。
17:01
诶,那么发展率里边去放咱们这个两行代码,那又由于呢,我们这个呃流呢,它自己还出现异常,那你这块呢,再去做一个。哎,就这样好,咱们把这个问题说一下啊,这涉及到这个知识点。说明的一个点啊,首先第一个点呢,就是大家关于这个read的方法的一个理解啊,啊这呢,咱们刚才在这写了这个事呢,非常重要啊,这是第一个知识点,第二个知识点呢,就是关于这个啊异常的处理啊,异常的处理,我们说为了保证说这个流资源啊,一定可以执行这个关闭操作,哎,我们说呢,需要使用try catch finally来处理。啊,需要用它来处理,行,这咱们呢就改了,感觉呢是挺好,但这里边还有一个小的问题,小的问题什么呢?哎,毕竟呢,咱们上面这是不是是个no啊,刚才呢,我们见到在这个位置可能出异常,那假假设你想想啊,如果是在这个位置出的异常。
18:13
一出异常的话呢,这就他就要出去了,但出去呢说等等我这有finally好,我们就蹦到这个finally这了。那你想想,由于是在这个位置出的异常,相当于这个对象是不是就没有实例化,那没有实例化上面你一上来就来个close。是不是就控制人了,所以这块呢,我们说哎,你这个呢,造完对象了,你后脚记着close,你要是没有造好对象,是不是就不要调close了,所以我们加一个if是吧,诶它不等于now的时候,哎我们呢,让它做一个诶close。这呢,就这一行代码,我就省略那个大括号了啊看这样写,哎,这个写法注意啊,跟跟这个写法你看有区别不?有同学可能会这样写哈,就是先呢写了一个if,它呢不等于no,那这里边呢是F2点做一个close,然后呢,诶out enter一下try catch是这样写的。
19:10
就是if里边呢写track开,我这个是开里边写的if,这俩有区别不。其实是都可以啊,哎,没啥大区别啊啊,因为呢,就这一行代码嘛,也没有多复杂的说很多行啊,哎,所以呢,至于说谁包谁其实都行啊,这没事行这呢是咱们说的这个关于异常的这个处理,大家一定要小心,后边呢,诶关于瘤这块呢,我们都要用它进行处理了,这是这个点,好再说一个点。再说一点,说谁呢?这块也说了,官这块也说了,那往回看看这块看这块啊,刚才呢,说在这个位置可能会出一个异常,这异常叫文件找不到的异常,什么时候会出呢?是不是你这个文件真的没有啊,比如说我这个写成个HELLO1了。显然呢,我这里边儿没有哈伊执行。
20:03
你看这时候呢,就报了这样的异常,说那叫啊file not found exception说系统找不到指定文件啊,这个原因呢,就是因为我们这个文件呢不存在,所以这块呢,我们总结一下就是什么呢?我们现在呢,是数据的一个读入哈,读入操作,咱们会从一个文件中读这个文件咱们要求一定要存在,你要不存在这个读是不是一定就会报异常了,对啊,这让我们写一下,说叫读入的这个文件一定呢要存在啊,说否则呢就会报啊叫file not found的exception,这个非常好理解。啊,这块写了以后,咱们要注意的就是一会儿呢,咱们可能还要从内存里边把这个数据呢往外写,往外写的时候呢,也会对应着一个file的终点,这时候你要注意就是诶,这个时候这个file是不是说一定要存在,还是说呢,可以不存在是吧?哎,可能会有不同啊,这块读入的时候呢,要注意它一定得在行,这样的话呢,我们就写了一个基本的啊,使用这个file reader的一个操作。
我来说两句