00:00
好,那刚才呢,咱们使用这个fair reader实现了一个基本操作,就是从咱们这个文件当中把这个数据呢读到咱们这个内存里了,那那接下来呢,我们在这个基础上呢,再进行一个简单的迭代,这个迭代呢,主要针对的就是我们这个readid方法,好,我再写一个这个代码啊这呢是一个单元测试,哎,Test还是我们说的这个叫file reader,哎,这呢我写个一啊哎这个呢,咱们这标识一下说呢,呃,对,其实是这个RA的方法的一个操作升级啊,这个升级的话呢,就是用到另外一个RAID的重载方法啊使用。它的一个重载的方法,别的位置呢都没有变,所以这块呢,我们就提到对一个文件,咱们现在呢,是进行一个读入操作了,这个操作呢,其实是比较规范的,咱们顺便呢,再总结一下,那么第一步你是一个读入操作,首先呢得保证是有对应的硬盘中的这个文件,那我们操作这个文件在咱们张二层面呢,万事万物皆对象,我得用一个类的对象呢去代表你,所以呢,首先提到了就是这个file类的一个实例化啊,就是我提供这个文件对应的一个file对象,第二个我这呢是一个读入操作,那就需要用流了,那第二个呢,我们就现在这个流的一个实例化。
01:23
那在咱们这个问题中,咱们操作的是一个文本文件了,这个流呢,咱们用的是file reader,那回头呢,可能不是这种文件,那咱们可能要换这个流,那就是把这个流呢换一下,换成别的流就行了,首先呢,也得需要去创建这个流的对象了,这是第二步了,然后第三步,在咱们这个问题当中呢,咱们是做了一个读入操作啊,那就是读入的。具体的这个操作细节。这呢,我就泛泛的写一个读入操作了,那回头呢,如果是写出,那你这块呢,就是一个写出的操作了啊,然后在最后第四步啊,那就涉及到这个资源的一个关闭,此时呢,我们在IO流这一章资源呢,就都是这些流,那就是这些流资源的一个关闭,如果涉及到多个,那就多个呢都关掉就可以了,所以说呢,我们这一章虽然讲的流呢很多,但是它的操作呢都比较规范,都逃不出这样的四步。
02:20
都逃不出这四步,区别在哪呢?就是后边呢,因为我们具体的情况不一样了,我们这儿用的这个流这个泪呢不一样了,然后呢,这个不一样了,读入或者是写出啊读入写出呢,又由于你操作这个实际情况不一样,可能这个细节呢也稍有区别,所以后续呢,主要体现在就是二三会有不同,哎这样呢,大家就能把握这个问题的一个本质了,行,那现在的话呢,咱们主要呢,对上面这个升级,就是在这个读入的一个过程做一个升级,其他位置呢没有变啊,所以首先我们这呢,仍然是一个fell。哎,我还去new一个。这块呢,我们还指向咱们当前操作这个文件啊,这块选中CTRLC一下。
03:03
啊,CTRLV直接把这个文件呢,就拷贝过文件名字就拷贝过来了,下面呢,还是我们这个叫file reader。哎,我呢还是把我们这个file对象作为这个参数呢,放到我们这个构造器当中表示呢,我们这个文件呢,读入的时候就是从这个文件读的,对应的路径呢就在这儿,呃,有一场暂时呢,咱们也先给它这个一下啊,在下面的话呢,涉及到具体的读入操作,咱们刚才调的呢,是叫read空餐的方法。表示呢,每次其实读入的是一个字符。啊,这里边儿这个文字,虽然说现在咱们这个只有十个这个这个字符了,实际上读读14按数就行了啊。当然其实是读了11次,因为你读第11次read完以后,是不是返回负一了,对啊,其实算是read了11次啊,就最后一次是负一,那么这儿呢,数据还比较少,那如果这个数据比较多的时候,你想想每次要一个一个读,这个效率啊就比较差,你需要呢,跟我们的硬盘是不是不断的这样去多read的方法去交互啊。
04:10
那这个效率就比较差。那其实这个事儿呢,很好理解,像这个生活中,比如说你这呢,是这个。大家中午订外卖也是一样啊,很多同学这不都是从这某一个饭店来订这个饭店的话呢,咱们班比如说这个,那咱们班人挺多哈,假如其中这个50个同学是订的这家饭店的,那这个饭店呢,就做了这个50份这个饭啊,他是一份一份饭嘛,呃,送嘛,送了一个,然后回去再取一个,再送,再取一个送,他能受得了,你也受不了是吧,你到这都饿的不行了,然后饭都凉了啊,所以他呢,是不是一次性的打了一个包就整个就过来了啊,那如果说呢,现在咱不是50个了,可能这个整个咱学校这500个学生都都从他家订了这个小车啊,盛不下,他这就每次只能是50个,那就是运了一波,是不是再回去运一波,但是他肯定也不会说一个月的运运,那同样的这个这个快递也是这样,那你看那快递小哥都有个小车是吧?啊小车呢,他不会说呢,送个快递每次就送一个,然后回去再取一个啊累死他了啊,每次呢就是放一波啊,送完这一波呢,回去再取一波,所以我们。
05:17
现在呢,Read也一样,每次一个一个读,太慢了,我们out这个斜杠一下,我们发现呢,它有一个方法可以传入一个叉形数组,数组不就是容器嘛,那我们相当于一次呢,是不是可以读入多个呀,哎,我们就用是这个方法啊,那既然用这个方法,我们提前呢,得把这个数组呢造出来,我们定一个叉型的数组,因为呢,咱们现在读的是字符了,所以这个数组呢,叫做差型数组。那如果回头咱们这是是一个字节的呢,对就是BAT数组了,哎这个很好理解,哎,我们这样定一下啊,嗯,然后呢,等于你一个呃叉啊这块呢,就涉及到你这个多长是吧,就是送外卖也好,或者呢,这个中午,呃这个这个快递这个小哥也好,他这个车到底能放多少个快递,能放多少份饭,这不就取决于我们这个数组的长度是多少嘛,咱们现在呢,先不整那么复杂,我就放五。
06:16
那UIG呢,就每次你往这个小车里边去读书,读到这个里边最多就写进去五个,那这块我们把这个C8就放这啊这个我我这个名字呢,起的是什么呢?哎,这个呢是个buffer,就是一个缓冲的一个小车一样啊,哎,我就捡起了,然后这个C的话呢,表示就是叉啊这样写的,那我们把这个方法呢,哎把这个数组呢,就个放到我们这方法的形态里边这个位置了,哎此时呢,这个抛一场,那我们也先让他先抛出去啊,那么关心的就是这个read的方法,它到底什么意思。啊,我们F2下看看。说呢,我们调的这个呢,是查询数组这个方法说返回值the number of characters read。
07:02
哦啊,后边也一样啊,就是你要读到文件末尾的还是返回负一,这个是什么意思呢?对,这就是每次我们读入到啊,每次读入的这个字符的一个个数。每次读入的这个字符的一个个数。哎,嗯,什么意思呢?比如说咱们这个hello word哈,诶咱们第一次读,因为这个文件比较长哈,第一次是不是就读进去五个,第二次呢,要读是不是接着读后五个,那如果要后边还有个123呢,第三次读。相当于只剩个123了,那我们就读进去三个,他们就会返回,这个方法就会返回,我读进去几个第三次,其实这个就是三。那那这样的话呢,我们去通过判断,哎,我这写一个变量啊,判断什么呢?判断我们这个len,它到底是不是负一,刚才不是也说到了,如果要是读到文件末尾了,它不就是负一了吗?所以我们这块呢,我还是省略它直接呢写个while,哎,然后判这个L1呢。
08:07
哎,拿我们这个read去赋值,赋完值以后看看这个结果呢,是不是负一。嗯,哎,负一啊这么着。OK吧,诶这呢先是一个赋值操作,然后看一下这个L1呢,是不是负一,是负一呢,就是到文件末尾了。啊,所以这块呢,这个方法啊,大家一定要注意一下,我这呢标识一下这个read的,此时呢,咱们是放在一个叉型的一个数组了。哎,这个呢,我们标识也说,嗯,这个返回每次。写错了啊,每次叫读入这个叉型,或者叫直接写CB啊。这个写成个F吧。嗯,返回每次读入到这个数组中的字符的个数。
09:04
啊,每次读到这里边几个啊,就像当你每次这个快递小哥往这个车里边到底放了几个快递啊这个意思,那么还是那如果啊达到文件末尾。末尾返回复议。行,那接下来我们看这个while里边,针对于某一次循环来讲,我们读进去几个,那下边呢,我就要把这几个呢,咱们sit out输出一下,那么想怎么输出啊。输出数组包循环呗。可以吧,哎,特I等于零,I小于,注意这是一个难点。写谁?有同学会说我写C8.less,这时候你要想写它对不对,哎这里边我们就输出一下,哎这呢,我就C8伏它这个I啊,这个我把这个换行去了啊,因为咱每次呢,就是没有换行,直接往后写写他行不行?
10:12
对,这个有的已经分析出来,其他是不行的,假设咱们先写上它啊,信任它,然后我们看这个结果会是什么,这个完了以后,一个要是负一呢,就退出了,后边呢,就只涉及到一个资源的关闭啊,F2点做一个close,哎,这就写完了,整个人就我们这个过程,过程完以后呢,我们说不能去用Rose了。诶涉及到资源关闭操作,我们呢,把这块到这out shift z给它拆开这翻来包一下。然后最后这个位置啊,你再加个if啊,如果F2不等于no。哎,这么着,然后呢,把这个资源的关闭诶。往上提提到这儿,然后呢,再al enter一下,给它拆开。行,这个其他过程都一样,主要呢,我们看的就是这个三啊,这个三呢,我暂时呢是这样写的,大家想一想这个结果会是什么,现在我跑一下啊。
11:08
走。好出来了,显然呢,跟我们本身这个文件呢不一样,首先啊,那其次我们分析。为什么是这样子的,这个过程很重要,大家要分析都都得会啊,这是我们这一章的一个难点,首先我第一次是不是读了一个hello word返回的这个L是不是就是五啊,对,那这块我遍历是不是就出来了,那第二次,第二次的话呢,我们又读这个文件挺长的,是不是又读进去五个,所以返回的这个还是五,那我们这块for循环是不是有五个。然后第三次就剩仨了,就读进去仨,所以返回的L1呢就三,这个时候你注意我们这个数组啊,不是咱们真送快递一样,你送完以后这个车就空了,这个时候呢,我们只是把这个数组的便利了一下,其实呢,第二次完了以后,是不是就是WOL是这样的几个字符了,嗯,第三次的话呢,你123过来,其实是把它覆盖成一,它变成二,它变成三,这俩呢,是不是还没变,哎,没变啊,就是第三个呢,其实我们这个数组呢,就长这个样子了。
12:20
那所以说我们接下来你这个for循环里边,我们呢,是写的数组点length。就会出来123LD了。这样其实不应该出来LD是吧,你是不是要便利值,让它便利到这就行,那所以说我们回来呢,要改要改是不是要改它呀。哎,不能这样写,这是一个错误的写法。这个是我们这一章的难点,要注意。错误的写法主要呢,就是我们针对这个位置,那应该写成谁呢。打开是不是应该呢,这个位置改成是不是LN就可以了。
13:02
你每次读进去几个,我这块呢,就哎这个这个就便利几个,就给你放快递,每次呢,我这里边我就车车可能很大哈,我每我这次呢,我就放进去五个快递,那这块呢,读的时候就取这五个快递,你不要呢过多的去取后边的,这就不对了,这要注意,这样呢是一个正确的,这是正确的一个写法,哎小心一点,那么我们跑一下看看。你看这样就对了,好,这呢是一个事儿,那么还可以怎么去便利呢,大家还可以这样去写,所以整个呢,这个我们可以看成是叫整体上来看方式一当中的错误和正确,然后再来看一个方式二,这呢其实是一个小事儿啊,就是看大家呢,你想怎么呈现出来了,呃,我们呢,这是写的一个for循环,其实呢,是不是可以给它造成一个string呢?String我们用一个string,咱们前面讲过差型数组到string的一个转换。用构造器吧,哎,构造器构造器里边好了,这样写对不。
14:07
把这个注释一下。这块呢,我就out。哎,把我们这呢编了一下,这个换行不要了,这样写行吗。这样的话,其实又错了。那又成这样了?因为你第三次的时候呢,我们这个呃,C8当中其实还是保留着那个最后的LD的,你这呢,就相当于把我们这个数组里边有什么就全取出来了,其实跟它一样。啊,这个一样啊,所以这个方式二呢,我们说这也是一个错误的写法。哎,这也是一个错误的写法,它呢来说对应着。哎,对应着我们这个方式一的这个错误的情况。哎,他俩其实是一个意思啊,这呢就是把这个数字里边有什么全变利,这个呢,其实也是一样,这样不对,那这块呢,我们取的时候呢,这个就得有条件了。
15:11
正确的一个写法,这个用string没问题,这个string的话呢,它这个构造器,你看还有另外一个啊,这个里边我们首先呢,把你这个C把火放进来,放进来以后这个呢,它还有其他重载的构造器,CTRL斜杠一下还有个这个。我们把这个字符数组当中的数据呢,变换成一个字符串,但是呢,我不想取你这里边的所有数据,我呢就从头开始取,每次呢只取len个,哎,用这个构造器,这个呢,其实就相当于我们的这种写法。哎,接着把我们这换行呢就干掉,这呢也是一个正确的好执行。哎,没问题。行,这呢是咱们这一章的一个难点,大家写的时候要注意什么呢?你看啊,这个位置呢,用的咱们是一个参数的。
16:03
然后这个位置呢,是哎,三个参数在这个。啊是三个参数的,那就别整反了,反了什么情况呢?这个read大家看啊,我这个点进来,咱们用的是这个方法,它其实还有这个重载的方法。Read的时候呢,你看我放进一个差型数组,诶,它还可以指定这个。首先说这个方法咱们很少用啊,这个方法什么意思,我就说一下啊,像咱们刚才呢,这个小车是不是就是五啊,长度是五沿IG呢就是这个方法啊,言IG呢,就是每次如果这个文件比较长,咱们是能往这里边写多少个呢就写多少个。像咱们这个当前不是有13个字符,哎,我就一开始这五个,那就写满它,后边呢,还有五个,那我也写满它。就是每次呢,能能往里写满就写满,第三次呢不够了,就剩仨了,那我就写了仨,反回来就是你到底是写进去几个,那要是这个方法read的话,这个方法要read的话呢,还是比如说这有13个字符,咱们要是调这个方法的时候,我这个位置呢,写的是零,这个位置呢,我写的三,咱们数组的长度是五,其实意思就是说13个字符,我现在让你吊坠的方法,我这个车呢,虽然是能最多放五个,但是呢,我不想让你放五个,你就每次给我放仨。
17:23
从头开始放,这是从零角标从头开始放,每次就放三个,虽然说呢车挺长,但是呢,我不想让你放这么多,这呢就只能取三个放,这就放满了,那下次再来只能还放三个去放。那通常咱们都不会去调这个方法了。啊,一般不会去叫这个,就是能写满就写满啊,那其实这个方法呢,是一个更普通的方法,这个len,如果你给它改成叫这个C,哎8for.length哎,它不就相当于是从头开始写,每次呢写满吗?哎,那不就相当于是咱们上面这个了吗?你看这不就是它吗。
18:05
理解吧,啊,这里边关于这个read呢,有好几个方法啊,第一个空餐的咱们这会讲了,每次呢就读入一个,那这个呢,就每次呢写到这个数组当中,就是尽可能的去写满,最后一次你想写不满的那就不满了,那么还有一个呢,就是诶,每次我指定往这里边写,但是呢,我不让你都,即使你这个数据很多啊,不让你放满,我只让你放指定几个啊,这是一个更通用的方法,但是这个呢,一般咱不用啊,用的话呢,都是用这个方法啊。这个大家注意一下这个事儿,也就是说呢,这个位置咱们是放在一个参数,而这块儿呢,像new string这是三个参数,不要写反了,这边呢写成三参数,这边写一个成这种了就错了。这是这一章的一个难点,后续后续的话呢,咱们只要是涉及到读入这块呢,都得注意这个事儿,要写出的话呢,写出咱们等一下去举例子说写出的问题啊,那相当于咱们能够以谁呢?哎,File reader等一下呢,我们讲叫file reader,以它两个最基本的一个写法,把整个我们这一章当中涉及到读,如何写出的一个标准的规范呢,我们就都能够讲清楚,那后续的写法跟它其实都类似一个套路。
19:19
行,这个我们先停一下。
我来说两句