更新時間:2022-07-08 來源:黑馬程序員 瀏覽量:
通過前面的前端培訓學習可知,Node,js的 File System模塊并沒有提供一個copy 的方法,但是通過讀取文件和寫入文件的方式可以實現(xiàn),即把文件A的內(nèi)容全部讀入Bufer緩沖區(qū),然后再從緩沖區(qū)讀出寫入文件B,該過程的執(zhí)行流程圖如圖1所示。
圖1文件流復制過程
在圖1中,可以看判讀取數(shù)煙需要存放到Batfer
級沖區(qū)中,然后在從級沖區(qū)讀出寫入到文件,Bulfer緩沖區(qū)限制在1GB,這樣的慢作對于小型的文本文件,沒有多大的問題,但是對于體積較大的文件,比如音頰、視頻文件,動輒幾G字節(jié)大小,如果使用這種方法,很容易使內(nèi)存“爆倉”,理想的方法應該是讀一部分,寫一部分,不管文件有多大,只要時間允許,總會處理完成,這里就需要用到流的概念,文件復制操作使用文件流的讀/寫機制進行會防止“爆倉”現(xiàn)象的出現(xiàn),流程如圖2所示。
在圖2中可以看到,文件A中數(shù)據(jù)以流動的形式通過數(shù)據(jù)流管道,然后進入到文件B中,采用“讀一部分,寫一部分”的方式。流的好處是接收方可以提前處理,縮短等待時間,提高速度。例如,在網(wǎng)絡上觀看視頻,并不是整個視頻下載好了才播放的,而是下一點播一點。
在Node.js中,文件流的操作由Stream模塊提供,Stream是一個抽象接口,Node.js中還有很多對象實現(xiàn)了這個接口。例如,對HTTP服務器發(fā)起請求的request對象就是一個Stream,還有stdout(標準輸出)等。
Node.js中,Stream有4種流類型:
(1)Readable:可讀操作(可讀流)。
(2)Writable:可寫操作(可寫流)。
(3)Duplex:可讀可寫操作(雙向流、雙工流)。
(4)Transform:操作被寫入數(shù)據(jù),然后讀出結果(變換流)。
在Node.js 中,很多模塊涉及流的讀/寫,例如,HTTP requests and responses、Standard
input/output、File reads and
writes。Node.js中的I/O是異步的,因此對磁盤和網(wǎng)絡的讀/寫需要通過回調(diào)函數(shù)來讀取數(shù)據(jù),而回調(diào)函數(shù)需要通過事件來觸發(fā),所有的Stream對象都是EventEmitter(事件觸發(fā)器)的實例。常用的事件如表3所示。
字節(jié)流與字符流之間如何實現(xiàn)轉(zhuǎn)換?