00:00
那刚刚呢,我们已经可以用read去读这个文件了啊,那你要记住了啊,我们用这个open方法去打开的文件,默认情况下就是文本文件啊,默认情况下它就是当这个文本文件打开的,那有同学可能会说,诶,那如果我是想打开的二进制文件。要怎么办呢?哎,别着急,二进制文件的事儿,我们先待会儿再说,我们先把这个文本文件那整明白了,那现在我们这里面注意了,我们瑞ID还有一个特点,我们说了什么呀?哎,我们如果,哎,我们如果直接调用我们这个read啊调用我们这个readid它会什么呢?它会将我们这个文本文件的所有内容干嘛呀,诶全部都读取出来啊,全部都读取出来,就是说他会考虑你这个文件到底多大,有多少内容我就读多少,你说我这读的是一个天龙八部,诶那他干嘛呀,也会把这个天龙八部的全文给你读出来,无论内容多少,它会全部读出来,那这样就会带来有带来一个问题,那如果是这样,那那如果什么呢?如果我们要读取的这个文件较大的话啊,如果要读取的文件较大的话,它会什么呢?它会一次性诶将我们这个文件的内容加。
01:17
加载到什么呀,加载到这个内存中容易什么呢?容易导致我们这个内存泄露啊,容易导致我们内存泄露,你想想我要读一个三个G的文件,诶三个G的文件那咔你一下读全都加在内存里边,首先它这个东西读的是不是很慢呀,诶他要花时间去读这个东西,这是第一个,第二一个读的很慢,然后它本身那个内容就三个G,那也就是他要占我内存三个G,我一下往内存里加出三个G的文件里,那它就是会容很容易让我们这个内存就泄露出去了,哎就泄露就是内存溢出对吧?诶内存溢出那这个时候就会带来一些什么呀,诶安全的一个隐患,所以所以什么呢?诶所以对于我们这个什么呀,较大的文件不要什么呢?诶,不要直接调用我们这什么呀,哎,Readid啊,不要直接调用这个readid,那要怎么办。
02:10
哎,那要怎么办?那这个时候其实呃非常简单,诶如果你不知道的话,你可以在这干嘛呀,你可以调一个help,我们直接来一个这个fair OB接点一个这个read,我们来看看这个RAID的一个帮助信息啊,我们直接看一眼,一执行,其实一执行你就看出来了,RAID里边它会有一个什么呀?哎,会有一个这个参数啊参数叫什么?叫做一个size啊,参数叫做一个size size什么意思诶,尺寸大小默认值是什么?默认值是负一,也就说这个参数我在这虽然没有传,实际上就是相当于写了一个什么呀,相当于写了一个负一,我这一执行效果是不是一样的呀?哎,效果是一样的,那这个东西可以用来干嘛?那这里边我们来说一下,哎,那我们说了read中。哎,可以接受一个这个size。
03:05
诶作为什么呢?作为参数,该参数用来指定我们这个要读取的什么呀,要读取的这个,哎,要读取的这个字符的一个什么呀,数量,也就是说你要读取几个字符,你要读取两个,读取三个,还是读取四个,还是读取八个,对吧?要指定读取字符的数量,那它是什么呢?默认值什么呢?默认值为负一,诶它会什么呢?它会读取我们这个,诶文件中的这个所有字符啊,所有字符,所以这个时候它的默认值是一个这个负一啊负一,那你写负一就读取所有的,那我们这块可以看一下,看什么呢?诶我们直接来看一下这个content content,然后我们来什么呢?我们来一个Le,一个这个content,我们直接来看它的一个长度,我们这一直行长度是什么呀?23,比如说它会把我们这个所有的23个字符干嘛呢?诶全都读取到啊,把这所有的23个字符全都会读取到,诶那这个时候我们来接着往下看,那为什么它会。
04:06
23个字符,诶我们来看看,这是2455个字符是吧?诶一行除了上五个字嘛,对吧,四行呢,应该是20个字符,为什么出现23个字符,诶因为五后边有回车,它后边有回车,它后边也有回车,所以他在这儿实际上是把回车都算上了,正好三行三换行,所以三个回车,那那个三个字符就是什么呀?哎就是回车啊就是回车,那好,那为了我们这来读一下吧,比如说我们在这想干嘛呢?哎,每一次我读六个啊,每一次我读六个,那我就可以把这个RA的这干嘛呀?哎,我直接改成一个什么呢?诶改成一个六,那这个意思就是每一次读六个,那这个时候我们来看啊,再看它的长度,我们这一执行锄禾日当午,那这个时候它读了锄禾日当午,然后包括它后边的换行是不是都给我们读出来了,哎,都给我们读出来,这次就读了几个,哎,读了六个啊,读了六个,好,那这个时候我们是不是就可以指定读取的一个数量了,哎,你想读多少就读多少那。
05:06
注意这个单位是字符啊,不是字节,是字符啊,是字符好,那我们说了,那我如果再掉呢,再掉呢,那注意了,再掉它这个时候就不是在读取原来那个六个,而是什么,而是再往下读取六个之前我们读的不是读到除日章五后边的换行嘛,这个时候他再读干嘛了?从这换行,也就是从这儿往后读,所以注意它不是每一次都从头读的,它是什么呀?它会记录你上一次读取到那个位置,你再掉的时候,它会干嘛呀?诶,它会从这个接着你那个位置往下去读啊,往下去读,所以这个时候除了张五读完了我再掉一遍,再掉的是谁?再读就是汗滴禾下毒,哎,然后我这再掉就是谁了,哎,就是我们这个,谁知盘中三啊也是六个,然后我再掉,再掉该谁了,哎再掉就该是我们这个粒粒皆心股,但是很明显我们这个粒粒皆心股是不是不够啊,因为他没有这回车,所以他就会读了什么呀,哎,读了五个啊,读了五个,所以。
06:06
这里边注意如果什么呢。哎,如果,哎,我们可以为我们这个size定一个什么呀,指定一个值,这样我们这个read它会什么呢?哎,会读取我们这个指定数量的一个什么呀?诶指定数量一个字符,那注意了,每一次读取啊,每一次读取都是什么呢?都是从我们这个上次诶读取到的这个位置开始读取的,哎,开始读取的,你上次读到除尔当午,我就从五后边开始读,你涂到汉尼纳图,我就从土后边开始读,都是从上一次那个位置开始去读取的啊每一次都是从上一次的位置开始读取的,如果什么呢?哎,如果我们这个字符的这个数量小于我们这什么呢?小于我们这个size什么意思?哎,你那个东西。你要读取六个,我最后就剩五个了,是不是比你这三次小啊,哎则这非常简单,则会读取什么呀?哎,剩余所有的,也就说你剩多少我就读多少啊,剩余多有的,你剩多少我就读多少,所以在这儿是这么一个意思,但是这个时候我们来看,现在我读到粒粒皆辛苦,很明显粒粒皆辛苦分里边是不是没有了,诶后边已经没了,那这个时候我再调一个什么情况,哎什么情况,我们这一执行有没有零,是不是没有东西啊?哎,没有东西,那如果什么呢?如果已经读取到了我们这个文件的什么呀?诶最后了,诶则什么呢?诶则会返回空串啊,则会返回一个空串,所以这儿注意它返回的是一个什么呀?诶是一个空串,因为后边已经没有内容啊,没有内容了,这是一个这个空串,所以注意我们在读的时候可以直接通过这个,诶read来读取啊,Read来读取,好,那read说完了,那现在我们来说,那假如说我现在想通过readid来读取一个哎文件。
07:58
那我要怎么办?哎,我想通过这个read来把我文件的内容所有东西都读取掉,那你说了,像我这种写法,我一行一行写,那是不是很麻烦呀?哎,一行一行写很麻烦,那我有什么办法也能干嘛呢?我还是一一点一点读啊,我还是一点一点读,但是什么呢?哎,我不要是我不要像这种一个个都给它写出来。
08:20
我能不能用一个,呃,用一个简单的方式去读这个东西啊,那我们来看一下,那在这我们单独来说一下干嘛呢?我们来说读取,诶读取我们这个大文件的一个方式怎么读取啊,那这里边我们还是file name,我们这也还是我复制一遍吧,我把这格式先复制过来,File name啊整个都复制过来。然后呢,这里边踹里边我们先给它都删掉。都删掉好,那这个是我们整体格式,在位里边我们就可以写代码了,那首先在位里我先写一个啊,我先来定义一个变量来干嘛呢?来指定我们这个每次读取的一个大小,就是你每次读多少啊,每次读多少,所以在这我们直接Chu NK创了等于什么呢?诶比如说我就等于一个这个,诶等于一个这个,呃,十吧啊或者等于100,十太小了是吧,十太小了们等于100,我们不读谁啊,我们不读那除二当了,我们改读我们那个DEMO啊,因为它那边字数太少了啊创造等于100,我每次读100个啊,每次都读100个,好,那接下来我们是不是要读了,诶但是读的话,你看这我这里边我这块我如果一个一个读的话,是不是很麻烦呀?诶,所以在这里边我这个东西要调用多次,那在这儿我们最直接的方式就是什么呀?诶创建一个循环来干嘛呢?诶来读取我们这个文件的一个内容啊,创建一个循环来读取我们这个文件的一个内容,那这个循环怎么写,我们一种简单的方式。
09:48
我可以直接写一个外处,我干嘛,我来一个这个死循环啊,我来一个死循环,在我们这个死循环里边,我是不是可以去去读啊,哎,外处我创建一个死循环,然后在这个Y处里边。
10:01
这个缩进有问题啊,我们调整一下。哎,这样就OK了,这一块应该也是有问题的。哎,你看这缩进没对齐的时候,一定要检查一下啊,一定要检查一下,好,那这块YO处我们在这可以直接写了,那YO处等于我是不是每一次都要读啊,哎,每一次要读,所以我在这直接来一个content,等于谁呢?诶等于我们这个file OB接点一个这个read read谁呀?诶read一个创,也就说我每一次是不是都读这么多呀?诶每一次都读这么多,那现在这个count就是谁了?诶count就是我们读取到那个内容了,那现在我就可以干嘛了,诶我可以直接来prevent一个content,我把这个内容给它干嘛呀?哎,给它打印出来就OK了,但是注意我这么写很明显存在一个很严重的问题,因为我现在是不是一个死循环呀,哎,死循环它不会停,所以在这我们要设置一个停止了一个条件啊,停止条件,那这块我们来怎么设置,在这儿我们先写一个注释啊,这是我们说读取我们这个创NK大小的一个内容啊,创是块的意思啊,读取这一块的内容啊,然后这是什么呢?这是我们这个输出我们这个内容。
11:12
然后在这儿我们可以干嘛?诶我们可以干嘛呀?诶检查是否读取到了内容,什么意思,因为我们这个content有可能不存在了,诶有可能不存在,它有可能空,那这个时候我们这个循环就没有必要再执行了啊,没有必要再执行了,所以这个时候我们直接来一个哎,If我们来什么呢?哎,Not content content什么意思?Not,首先content什么时候不存在,如果它是一个哎,不用写,哎对,就写一个not content,如果content是一个没有读取到的话,它返回的是不是一个空串啊,诶空串我们说了,在我们空串这会自动转换成false啊,空串会自动转换成false,那我这直接来一个not false是不是等于是true啊,也就说如果这是空转,它会变成true true是不是进入判断呀?哎,进入判断,在这我们说了,内容已经读取完毕,内容读取完毕,读取完毕我们直接干嘛呀,哎,Break b EK break,我们来干嘛?哎,我来退出。
12:12
哦,循环,诶退出我们这个循环,这一保存是不是就OK了啊就OK了,那这样它就可以来自动的读取我们文件当中的一个内容啊,效果是一样的啊,看效果我这一执行有一个是不是也读到了,哎,但是你会发现每一段内容是不是怪怪的呀,诶为什么怪怪的,因为我们在这用print去打印,而我这个print是不是分多次执行的,哎,Print的习惯,每一行结束之后是不是加一个换行,哎加一个换行,所以在这儿它会有一些很奇怪的换行,所以在这呢,我们可以干嘛呢?哎,我们可以来一个这个,嗯。哎呀,把这换行给它去了啊,摁等于一个这个空号一直行,这样是不是就OK了,哎,这样OK了啊把这换行给它去掉就OK了,或者有同学说老师我现在我不希望干嘛呀,我不希望它打印,我是希望有一个整体内容,我给他在外边我能看的,那这个时要怎么办?诶也非常非常的一个简单啊,也非常简单,我可以干嘛呢?哎,在这我可以来定义一个变量。
13:11
定义一个这个变量来干嘛呢?哎,来保存我们这个文件的一个内容,我直接来一个这个file content啊,所有TNT等于一个空块,然后干嘛呢?这个是不是我们每次读取到的内容啊,我这是不打印了,我直接来一个,直接来一个这个file content加等于我们这个content,我把每一次读取到内容是不是给它拼进去,哎拼进去以后,最后我们在这儿直接print,我们这个file content直接已执行,那这个就是我们所读取到的内容。看懂这意思了吧,哎,那这样我们就获取到了,我们所读取到这个内容,那这个就是我们说的一个什么呀?哎,读取大文件一个方式,说白了整体思想就是如果这个文件太大的话,你一次读下来会对我们内存,对我们系统性能消耗比较大,我们干嘛呀,我们分块诶我读一块再读一块儿,再读一块儿,我分块去读,那这样是不是就相对来说性能能好一点啊,性能能好一点,但是注意啊,对于我们现在这个玩意儿来说,DEMO2DEMO都是比较小的啊,都是比较小的,真正遇到大文件的时候,这个优点就体现出来了,现在这只能是体现出就是麻烦了,但是真正的是大文件的话,你必须采用什么呀?哎,采用这种方式啊,采用这种方式好,那这个是我们说读取文件的一个,哎,通用的一个方式啊,我们也是一个比较常用的一种方式啊,这里我们来评一下,待会自己来尝试着理解一下这个代码,来尝试自己读一下这个文件啊,我们来停一下。
我来说两句