00:00
下来呢,我们来说一下,我们在文件读取还有一种比较常用的方式,就是以什么呢?呃,零七,我们叫做一个流式文件读取,这流式文件读取其实还是这个作用,我们会发现刚才我们在去读取文件的时候,我们能简单读取方式的话,它实际上是不是给我返回了一个data塔这个数据啊,那这个东西注体有什么问题,他是一次性把这个数据保存到这个里边,是不是给我返回的呀,那他有什么问题呀,如果数据特别多的话,假如我读了一个一个G的文件。那可能我服务器的内存一共就两个G,读完了以后全都在内存里,是不是有可能我内存就溢出来,所以这种读取的时候风险其实要更大一些啊,更大一些,那所以我们来说流式文件读取,同样它也适用于什么呢?一些这个大文件,呃,流式文件读取也适用于一些这种什么呀,诶比较大的文件,它有什么特点呢?它可以分多次将我们这个文件读取到我们这个内存中,也就是说它干嘛呀,它不是。
01:07
一次性全都读了,比如说一个文件特别大,以前我分一次,如果我用留置。我可以分十次或者分100次去读起来,那这样我一个大文件拆分成一个小文件,就像一个水管一样,我这水是一点一点流进去,而不是什么呀。一块全流进啊全流进去好,那这一块我们直接说了,不再说它多的特点了,主要就是适用一些大文件,那我们要读的话,还是先来挖一个FS等于块一个FS,是不是先引入我们这个FS模块啊,哎,引入F模块,引入完了以后我们再来说,引入完了我们这块要干嘛,要读取我得先创建一个可读流,刚才我们red able是可写流,那这还有一个可读流,那我们这来一个哇,一个这个可读流叫做一个read streamam啊read streamam等于什么呢?FS点一个可read,一个read streamam啊read streamam它里边还是,其实我们这只需要一个参数,就是什么呀,路径,比如说读谁呢?我还读这个安点GBD,诶还读这个图片,那现在我们这个流是不是有了呀,同样我也可以监听这个的什么呀,开启还有关闭,哎,监听我们流的一个开启和这个关闭,然后这来一个is,点一个这个one,我们来一个open。
02:24
Opn,然后这来一个function function在这写一个什么呢?直接cancel.log一个,这是我们这个可读打开了。好,然后在这我再复制一下,再来什么呢?来一个可close,哎可毒瘤关闭,哎是不是跟那一个套路啊,一个套路啊,我在这一运行走,你是不是打开了,首先说有没有关闭,没有关闭啊,没有关闭,那我们来再看个问题,有没有读数据啊。
03:00
没有读数据吧,哎,并没有出现读数据,那我怎么通过可读流去读数据啊,可写流我们在写数据的时候是掉的一个right,那我们可能会猜读我是不是掉个RA呀,但是呢,还真不是掉read。那它要怎么读呢?我们注意,我们如果要读取一个可读流中的数据,必须要干嘛呢?必须啊,必须要为我们这个可毒瘤绑定一个这个data事件,Data塔事件绑定完毕,诶,它会什么呢?它会自动开始。哎,读取数据啊,会自动开始读取数据,所以可读流读取非常简单,直接RS,我来什么呢?来一个啊注意这就不能用ones了,因为我们说了它会分多次去读取数据,如果你这还来个ones,那是什么了,只能读一次了啊,我要来一个啊啊完了以后呢,事件叫做一个data,然后这需要传一个function,那这里边我们来看效果啊,Function你知道我现在什么都不写,我这一运行你看打开了,然后干嘛了,关闭了,刚才我没绑的时候关没关没关,绑完了以后是不是自动就关了,为什么关了?诶你看我播诶读完了它会自动干嘛呀,关闭,我不绑啊,直接运行是不是没有关闭这事儿啊,但是绑定的时候它会干嘛呀,出现关闭,为什么?因为绑定这个东西,它会自动读取,读取完了就会自动干嘛呀,关闭流啊,自动关闭流,但是问题又来了,问题来了。
04:41
哎,读取完了数据跟哪儿呢?这就相当于干嘛呀,我这水管已经接上了,我已经嘬完了,这水已经开始流了,但是问题是流哪去了?不管流哪,我又没有接到这水,没有那去哪了?哎,注意它读取到的数据都是通过参数返回的,在这儿我可以定义一个什么呀,参数来接收这个data是谁,就是读取到的数据,所以在这看着我直接来一个data塔,点一个log,然后我再运行。
05:15
看到了吗?这就是读取到的一个数据,所以它会将数据作为我们函数的回调函数来,这个参数来返回啊,参数来返回,而且注意它这里边儿就没有error了,因为一旦事件触发了,就不可能再出错了啊,所以就没有error了,那这数据是不是读到了,那问你读了几次呀,一次诶。刚才不刚才说读两次不读多次吗?这地方怎么读一次了,为什么?因为文件太小了,不值当的读好几次,能理解吗?如果是一个稍微大一点的文件,它就会分多次了,那怎么大,咱们来看,我们比如说刚才我这个MP3,我把这路径复制过来。来CTRLC,现在我不读这文件了干嘛呢?我读这个MP3路径,改成这个MP3的这个路径,这个再看啊,我这一保存咱们运行一下,这个还是读一次吗?是不是读了很多次啊,哎,很多次实际上我们来看看,那我要想知道他每次读了多少数据,怎么办呀?哎,这点一个Les我们这运行一下,诶来看每次是不是都是读65536啊,最后一次不够了,是不是就没读啊,哎,没读每次都是65536,这是什么呀。
06:33
字节啊,每一次都读这么多的字节,也就是说你即使文件再大,我会不会一次性把这个文件全都加载出来,不会,而每次只读取什么呀,只读取一部分,看懂这意思了吧,就避免占用我们这个大量的一个内存空间啊,内存空间好,那这就是我们一个流式文件读取,但是问题又来了,这玩意儿读完了之后。
07:00
读完了的是不是都一段一段呀,那我现在要想写怎么办?我想把这文件给它写出去怎么办?那我是不是又需要一个流啊,哎,又需要一个流,那假如我想把读取到内容写到一个可写流里怎么办?那我在这儿是不是要创建一个这个可写流啊,哎,可写流这我来一个Y一个WS等于FS点一个这个可一个red stream,我直接干嘛呢?写到这一个A点MP3,那也就是说我是想把这个文件写到我这个A点MP3这儿啊,这可写流已经有了,那有了以后干嘛呢?啊,Red了,应该是啊,可写着。哎,可血流,这可血流是不是已经有了呀?哎,有一个可读流读出出去了,有一个可血流可以去写出去了,两个水管子都有了,接下来怎么办?哎,我是不是把两个水管子一一对就行了呀,哎,一对就行了啊来那这里边为了监听一下,我给这WS也绑定一个这个事件,但是这事件啊不是必须的,我们这为了掩示才给它绑定的,因为你会发现绑定这事件它挺挺麻烦的是吧?WS这是我们这可血流打开了,这是我们这个可血流关闭了啊这一保存我先不输出数据了啊,我先不出数据了,现在我们来看直接运行走,你是不是都打开了,可读瘤关闭,但是可解时候关没关闭啊,没关闭这M是不是已经有了呀,但注意这对吗。
08:32
不对,因为我还没写呢吧,所以这只是一个空文件啊,空文件那我怎么往里写,哎,在这儿我是不是需要将我们这个什么呀?诶将我们这个读取到的数据干嘛呢?写入到我们这个可写流中,怎么写,直接WS点1RIGHT什么一个data干嘛呀,是不是就把这数据写过去了,哎写过去了,写过去以后不要忘了,我们还要做一件事,我是不是要关呀,把毒流用不用关了,可毒瘤是不是自己关了和血流我是不得关呀,那问题来了,什么时候关?
09:11
我在这来一个WS点一个N的行不行,行不行不行吧,因为这样就会导致我只读了一条数据,是不是把给关了呀,这样肯定不行,什么时候关读完了才关吧,什么时候读完了。是不是可写流关闭的时候啊,哎,这可读流关闭的时候对吗?所以这块注意数据读取完毕,我要干嘛呀,关闭我们这个可血流啊,可血流这儿保存咱们再看直接运行诶可写流可独轮打开了,可写流打开了,然后可毒瘤关闭了,可血流关闭了是不是就完事了,来看我们这MP3直接这来。Open open show in explorer是多大个啊,400408KB,我直接看大小了啊,这属性是一个这个3.91大小对吧,看我们桌面那个直接右键属性3.91是不是基本上没问题了,也就说我已经把这MP3是不是写到这来了啊,写到这了能不能放。
10:16
OK了啊,也可以去播放了,所以这文件写完了基本上就没问题了,但是其实有一个最大的问题,这也忒麻烦了,好这家伙这一套是吧,那写完了就已经封了是吧,太麻烦了,那有没有什么简单的方式啊?来复制一下CTRLCCTRLV,这来一个零八还是流式文件读取,这忒麻烦了是吧?你看看创建一个可毒瘤,创建一个可写流,然后我还鉴定这几个事件,然后这还去整这玩意儿,是不是太麻烦了,我们有没有什么简单的方式啊?我不就是想把一个可读流的内容写到一个可写流里边呢?比如说我这换一个我不写A了,我换一个B点单怎么写?注意了,在我们这个right stream里边有一个方法,我把那个date date事data下事件干嘛了,删了吧,删了现在你在运行它压根就不会干嘛了。
11:17
不会写了吧?哎,不会写了,那这一块我们来说一下,在我们这个red stream里边有一个方法,RS有一什么呢?有一个方法叫做一个PE拍什么意思,管道啊,管道来一个什么呢?WS,这表示什么意思,我在这个RS和WS之间架起了一个什么呀管道,那它俩是不是连到一起了,连到一起了,那这样就会干嘛呢?就会自动将我们可读流读取到内容,直接输送到什么呀,可写流里啊可以对,所以这一块我们来看一下,我们说一下type它可以什么呢?可以将我们这个可读流中的这个内容直接输出到我们这个可写流中啊可写流中看效果,直接运行来看,走你栏目们来看,你会发现我没有绑定data塔事件,我刚才把那个可写流摁的是不是也也住了,也住了,但是你会发现可读瘤关闭了,可写流干嘛了,也关闭了,为什么关闭了。
12:17
哎,因为拍PE在里边干嘛呀,自动完成了,能懂我意思吗?所以如果你真的想把一个可读瘤可写流,它们之间的信息互相传递,其他都不用掉,直接干嘛呀拍就OK了,那我们来看数据过不过来看这儿b.M3是不是也有了,我就不看了啊,大小都是一边大的啊,都是一边大的,所以这个数据就没问题了。当然其实这一块的事件,如果你不想监听,完全可以干嘛不写,其实说白了就这么几张代码,先创建一个FS模块,然后创建一个可读流读取数据,再来创建一个可写流,是不是接收数据啊,然后来一个拍,直接把可读流数据写到可写流里,那这样是不是就简单多了啊,简多了啊好,那这个是我们说的一个这个流式文件读取啊,好,那这个文件的读取还有写入,我们就都给他这个说完了,那这几种方式还是啊,可能我们在后边去用的时候,可能到反而不不去使用这些东西,因为这些东西实际上都是。
13:17
我们的什么呀,底层在用的我们的服务器,底层需要大量的去对这个文件这个流进行操作,为什么呀,为什么呀,我们想想我们服务器是干嘛的,是接收用户发送的请求,并且给用户返回响应的吧,那其实注意这个请求,这个响应到底是什么。什么?其实这个请求和响应就是一个数据流,就是一个数据流发送的请求其实就是一个什么呀,就是一个流,就相当于什么呀,相当于我们这个文件在我们这个,我们这个浏览器和我们这个服务器之间架起什么呀,架起了一个可写流,可写流然后呢,客户端往服务器去写东西,能懂吗?那这个东西我们写到服务器,服务器是不是就通过这个流去。
14:08
读数据啊,读到数据以后,我是不是要服务器往浏览器去返回响应啊,那这个响应相当于什么呢?相当于我的服务器给我们的浏览器加载什么呀?可写流,通过这个流是往这个服务器去,往这个客户端去写内容,能懂吗?但是这里边注意啊,稍微理解一下,底层用的都是这些东西,但是我们自己写的时候倒写的不是那么多,但是我希望你把这东西这种方式给它理解一下,这个流就把它当成是这么一个水管了,就OK了啊OK了,好了,这是我们说一个流式文件。
我来说两句