亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

深入淺出了解Node.js Streams

2024-05-06 16:51:28
字體:
來源:轉載
供稿:網友

什么是流(steams)

流(stream)是 Node.js 中處理流式數據的抽象接口。

Streams 不是 Node.js 獨有的概念。它們是幾十年前在 Unix 操作系統中引入的。

它們能夠以一種有效的方式來處理文件的讀、寫,網絡通信或任何類型的端到端信息交換。
例如,當你編寫了一段程序用來讀取文件時,傳統的方法是將文件從頭到尾讀入內存,然后再進行處理。而使用流的話,你就可以逐塊讀取它,處理其內容而不將其全部保存在內存中。
以如下代碼為例

const fs = require('fs');const rs = fs.createReadStream('test.md');let data = '';rs.on("data", function (chunk) {data += chunk;});rs.on("end", function() {console.log(data);});

利用 createReadStream 創建一個讀取數據的流,來讀取 test.md 文件的內容,此時監聽 data 事件,它是在當流將數據塊傳送給消費者后觸發。并在對應的 eventHandler 中,拼接 chunk。在 end 事件中,打印到終端上。
之前說流,可以逐塊讀取文件內容,那么這個塊,也就是 chunk 是什么?
一般情況下是 Buffer,修改 data 事件的 eventHandler 來驗證下

rs.on("data", function (chunk) {console.log("chunk", Buffer.isBuffer(chunk)) // log truedata += chunk;});

流的工作方式可以具體的表述為,在內存中準備一段 Buffer,然后在 fs.read() 讀取時逐步從磁盤中將字節復制到 Buffer 中。

為什么要使用 Stream

利用 Stream 來處理數據,主要是因為它的兩個優點:

內存效率:在夠處理數據之前,不需要占用大量內存;

時間效率:處理數據花費的時間更少,因為流是逐塊來處理數據,而不是等到整個數據有效負載才啟動。

首先內存效率,與 fs.readFile 這種會緩沖整個文件相比,流式傳輸充分地利用 Buffer (超過 8kb)不受 V8 內存控制的特點,利用堆外內存完成高效地傳輸。相關驗證可以參考這篇博文,地址。
時間效率,與 fs.FileSync 相比,有些優勢,但是與異步的 fs.readFile 相比,優勢不大。

Node.js 中 Stream 的使用

首先用一張圖來了解下 Node.js 中有哪些內置的 Stream 接口

Node.js,Streams

圖中提供了一些 Node.js 原生的流的示例,有些是可讀、寫的流。 也有一些是可讀寫的流,如 TCP sockets、zlib 以及 crypto。

特別注意: 流的讀、寫與環境是密切相關的。例如 HTTP 響應在客戶端上的可讀流,但它是服務器上的可寫流。同時還需要注意,stdio streams(stdin,stdout,stderr) 在子進程上是相反的流。

使用一個例子來展示流的使用

首先利用如下腳本創建一個比較大的文件(大概 430 MB)

const fs = require('fs');const file = fs.createWriteStream('test.md');for(let i=0; i<= 1e6; i++) {file.write('hello world./n');}file.end();

在當前目錄下,啟動 http 服務

const http = require('http')const fs = require('fs')const server = http.createServer(function (req, res) {fs.readFile(__dirname + '/test.md', (err, data) => {res.end(data)})})server.listen(3000)

得到的結果,如圖

Node.js,Streams

const http = require('http')const fs = require('fs')const server = http.createServer((req, res) => {const stream = fs.createReadStream(__dirname + '/test.md')stream.pipe(res)})server.listen(3000)

Node.js,Streams

時間減少了 2s 多。這可以解釋為,在讀取文件內容,并且不需要改變內容的場景下,流能夠完成只讀取 buffer,然后直接傳輸,不做額外的轉換,避免損耗,提高性能。
上述代碼中,應用了 stream.pipe(...) 。它主要是對流進行鏈式地管道操作,例如

src.pipe(dest1).pipe(dest2)

這樣數據流會被自動管理。

如果可讀流發生錯誤,目標可寫流不會自動關閉,需要手動關閉所有流以避免內存泄漏。

通常,當你使用 pipe 方法時,就不需要使用事件,但如果場景需要以更靈活、自定義的方式使用流,那么就要考慮事件。

Stream events

在上述例子中,我們使用了可讀流的 data 、end 事件來控制文件的讀取,它本質上與 pipe 方法相同,例如

# readable.pipe(writable)readable.on('data', (chunk) => {writable.write(chunk);});readable.on('end', () => {writable.end();});

只不過,使用 event 會更加靈活,可控。

Node.js,Streams

圖中簡單羅列了可讀流、可寫流的相關事件、方法,其中最重要的是

可讀流:

  • data 事件:每當流將一大塊數據傳遞時,就會觸發;
  • end 事件:當沒有更多數據要從流發出時,就會觸發。

可寫流:

  • drain 事件:當可以繼續寫入數據到流時會觸發事件;
  • finish 事件:處理完全部數據塊之后觸發。

流的不同類型

除了上面涉及到的可讀、寫流之后,還有 Duplex、Transform 兩類:

  • Readable :可以接收數據,但不能向其發送數據。當你將數據推送到可讀流中時,它會被緩沖,直到消費者開始讀取數據;
  • writable :可以發送數據,但不能從中接收;
  • Duplex :即可讀也可寫;
  • Tranform :與 Duplex 一樣是可寫又可讀的,但它的輸出與輸入是相關聯的。

如何創建一個可讀流

這里只做簡單介紹,具體見 stream module。

const Stream = require('stream')const readableStream = new Stream.Readable()readableStream._read = (size) => {console.log('read', size)}

利用 Stream 模塊初始化一個可讀流,然后向其中發送數據

readableStream.push('hi!')readableStream.push('ho!')

如何創建一個可寫流

為了創建可寫流,需要擴展了基本的 Writable 對象,并實現了它的 _write 方法。

const Stream = require('stream')const writableStream = new Stream.Writable()

實現 _write 方法:

writableStream._write = (chunk, encoding, next) => {console.log(chunk.toString())next()}

結合上述例子實現

利用 readableStream 讀入數據,并輸出到 writableStream

const Stream = require('stream')const readableStream = new Stream.Readable()readableStream._read = (size) => {console.log('read', size)}const writableStream = new Stream.Writable()writableStream._write = (chunk, encoding, next) => {console.log('write', chunk.toString())next()}readableStream.pipe(writableStream)readableStream.push('hi!')readableStream.push('ho!')/* log:read 16384write hi!write ho!*/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品一区中文字幕乱码| 久久久久久久一| 国产va免费精品高清在线观看| 亚洲精品狠狠操| 一本一本久久a久久精品综合小说| 亚洲加勒比久久88色综合| 亚洲免费视频一区二区| 亚洲 日韩 国产第一| 欧美大成色www永久网站婷| 精品成人久久av| 青青精品视频播放| 亚洲电影成人av99爱色| 成人黄色在线观看| 欧美日韩亚洲国产一区| 成人在线激情视频| 一本一本久久a久久精品综合小说| 亚洲欧美日韩视频一区| 国产又爽又黄的激情精品视频| 正在播放亚洲1区| 国产精品中文在线| 一区二区三区黄色| 精品久久久久人成| 精品欧美一区二区三区| 91精品国产综合久久香蕉922| 国产偷亚洲偷欧美偷精品| 91成人精品网站| 亚洲精品中文字幕av| 久久全国免费视频| 国产精品情侣自拍| www.欧美精品一二三区| 欧美日韩在线一区| 日本午夜在线亚洲.国产| 在线观看欧美日韩国产| 日韩人在线观看| 91免费的视频在线播放| 亚洲欧美在线一区二区| 国产欧美日韩亚洲精品| 亚洲人成伊人成综合网久久久| 国产精品久久久久久影视| 欧美性猛交xxxx久久久| 国产精品美女视频网站| 91av在线免费观看| 欧美夫妻性生活xx| 久久综合国产精品台湾中文娱乐网| 欧美电影免费观看电视剧大全| 亚洲欧美激情另类校园| 久久久www成人免费精品| 亚洲美女在线观看| 国产99久久精品一区二区| 久久免费视频在线观看| 亚洲加勒比久久88色综合| 国产精品自拍视频| 日韩av中文字幕在线播放| 亚洲最大av网站| 久久久久国色av免费观看性色| 国产精品欧美日韩| 亚洲午夜女主播在线直播| 久久精品国产精品| 欧美日韩国产色视频| 精品一区电影国产| 欧美日韩综合视频网址| 亚洲综合中文字幕68页| 91精品国产自产在线观看永久| 亚洲国产天堂网精品网站| 久久九九有精品国产23| 亚洲电影在线看| 日韩在线欧美在线国产在线| 国产亚洲精品久久久久久| 国产suv精品一区二区三区88区| 国模视频一区二区三区| 九九久久国产精品| 日韩经典一区二区三区| 亚洲精品视频网上网址在线观看| 国产日韩在线看片| 青青草原成人在线视频| 欧美一级免费视频| 精品国产一区二区在线| 亚洲色图狂野欧美| 色噜噜狠狠狠综合曰曰曰| 狠狠综合久久av一区二区小说| 欧美大片大片在线播放| www.美女亚洲精品| 欧美在线一区二区三区四| 亚洲欧美中文在线视频| 亚洲欧美一区二区激情| 亚洲欧美成人网| 亚洲综合在线做性| 久久久久久亚洲精品中文字幕| 欧美一区二区三区四区在线| 欧美国产视频一区二区| 国产亚洲精品va在线观看| 91久久久久久久久久| 欧美精品在线观看91| 国产成人精品综合| 久久国产精品久久久久| 精品美女国产在线| 亚洲免费视频观看| 777午夜精品福利在线观看| 成人精品一区二区三区电影免费| 国产一区红桃视频| 国产在线视频欧美| 日韩高清电影好看的电视剧电影| 九九精品在线播放| 久久天堂av综合合色| 色吧影院999| 国产成人精品日本亚洲专区61| 国产精品91视频| 日韩欧美一区二区在线| 国产精品日韩久久久久| 成人av在线网址| 久久久91精品国产一区不卡| 日韩有码在线电影| 亚洲日本成人女熟在线观看| 亚洲视频欧洲视频| 亚洲男人的天堂在线播放| 岛国精品视频在线播放| 免费成人高清视频| 国产精品久久久久高潮| 国产精品久久久久久久美男| 久久精视频免费在线久久完整在线看| 欧美第一黄网免费网站| 久久久精品国产网站| 久久久国产一区| 伊人久久综合97精品| 日韩av综合中文字幕| 久久久国产成人精品| 欧美激情在线播放| 亚洲大尺度美女在线| 88国产精品欧美一区二区三区| 国产色综合天天综合网| 国产精品视频网站| 欧美激情xxxxx| 久久久久久久久久久91| 国产a∨精品一区二区三区不卡| 亚洲视频一区二区三区| 国产色婷婷国产综合在线理论片a| 一区二区av在线| 81精品国产乱码久久久久久| 久久精品视频一| 精品夜色国产国偷在线| 欧美黑人xxxx| 国产99久久精品一区二区 夜夜躁日日躁| 久久精品夜夜夜夜夜久久| 亚洲成年网站在线观看| 在线电影欧美日韩一区二区私密| 久久99视频免费| 日韩av第一页| 亚洲第一福利在线观看| 精品性高朝久久久久久久| 国产精品偷伦视频免费观看国产| 国产精品男人的天堂| 国产玖玖精品视频| 97精品伊人久久久大香线蕉| 日韩中文av在线| 日韩免费观看网站| 欧美性资源免费| 国产视频一区在线| 中文在线不卡视频| 日本高清视频精品| 欧美小视频在线| 亚洲精品视频在线观看视频| 亚洲国产成人久久| 日韩国产精品亚洲а∨天堂免| 这里精品视频免费|