全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

什么是文件流?Stream文件流有幾種類(lèi)型?

更新時(shí)間:2022-07-08 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

通過(guò)前面的前端培訓(xùn)學(xué)習(xí)可知,Node,js的 File System模塊并沒(méi)有提供一個(gè)copy 的方法,但是通過(guò)讀取文件和寫(xiě)入文件的方式可以實(shí)現(xiàn),即把文件A的內(nèi)容全部讀入Bufer緩沖區(qū),然后再?gòu)木彌_區(qū)讀出寫(xiě)入文件B,該過(guò)程的執(zhí)行流程圖如圖1所示。


1657266755117_61.png

圖1文件流復(fù)制過(guò)程

在圖1中,可以看判讀取數(shù)煙需要存放到Batfer 級(jí)沖區(qū)中,然后在從級(jí)沖區(qū)讀出寫(xiě)入到文件,Bulfer緩沖區(qū)限制在1GB,這樣的慢作對(duì)于小型的文本文件,沒(méi)有多大的問(wèn)題,但是對(duì)于體積較大的文件,比如音頰、視頻文件,動(dòng)輒幾G字節(jié)大小,如果使用這種方法,很容易使內(nèi)存“爆倉(cāng)”,理想的方法應(yīng)該是讀一部分,寫(xiě)一部分,不管文件有多大,只要時(shí)間允許,總會(huì)處理完成,這里就需要用到流的概念,文件復(fù)制操作使用文件流的讀/寫(xiě)機(jī)制進(jìn)行會(huì)防止“爆倉(cāng)”現(xiàn)象的出現(xiàn),流程如圖2所示。
1657273043301_62.png
在圖2中可以看到,文件A中數(shù)據(jù)以流動(dòng)的形式通過(guò)數(shù)據(jù)流管道,然后進(jìn)入到文件B中,采用“讀一部分,寫(xiě)一部分”的方式。流的好處是接收方可以提前處理,縮短等待時(shí)間,提高速度。例如,在網(wǎng)絡(luò)上觀看視頻,并不是整個(gè)視頻下載好了才播放的,而是下一點(diǎn)播一點(diǎn)。

在Node.js中,文件流的操作由Stream模塊提供,Stream是一個(gè)抽象接口,Node.js中還有很多對(duì)象實(shí)現(xiàn)了這個(gè)接口。例如,對(duì)HTTP服務(wù)器發(fā)起請(qǐng)求的request對(duì)象就是一個(gè)Stream,還有stdout(標(biāo)準(zhǔn)輸出)等。

Node.js中,Stream有4種流類(lèi)型:

(1)Readable:可讀操作(可讀流)。

(2)Writable:可寫(xiě)操作(可寫(xiě)流)。

(3)Duplex:可讀可寫(xiě)操作(雙向流、雙工流)。

(4)Transform:操作被寫(xiě)入數(shù)據(jù),然后讀出結(jié)果(變換流)。

在Node.js 中,很多模塊涉及流的讀/寫(xiě),例如,HTTP requests and responses、Standard input/output、File reads and writes。Node.js中的I/O是異步的,因此對(duì)磁盤(pán)和網(wǎng)絡(luò)的讀/寫(xiě)需要通過(guò)回調(diào)函數(shù)來(lái)讀取數(shù)據(jù),而回調(diào)函數(shù)需要通過(guò)事件來(lái)觸發(fā),所有的Stream對(duì)象都是EventEmitter(事件觸發(fā)器)的實(shí)例。常用的事件如表3所示。
1657273685430_63.png





猜你喜歡:

字節(jié)流與字符流之間如何實(shí)現(xiàn)轉(zhuǎn)換?

怎樣執(zhí)行for循環(huán)語(yǔ)句?for循環(huán)語(yǔ)句執(zhí)行流程

Node.js模塊化重寫(xiě)計(jì)算器案例

黑馬程序員前端與移動(dòng)開(kāi)發(fā)培訓(xùn)

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!