日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

认识Node.js中流

發(fā)布時(shí)間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 认识Node.js中流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

認(rèn)識Node.js中流

http://wwsun.github.io/posts/stream-in-nodejs.html?utm_source=tuicool&utm_medium=referral

流是Node.js中一個非常重要的概念, 也是Node.js之所以適用于I/O密集型場景的重要原因之一。 流是Node.js移動數(shù)據(jù)的方式,流可以是可讀的和/或可寫的。在Node.js中很多模塊都使用到了流, 包括HTTP和fs模塊,本文將用盡可能簡單的方式為你介紹Node中流的概念。

流 Stream

事實(shí)上,流通常用于將程序連接在一起。流可以被讀和寫。被流連接在一起的程序通常很小,并且只專注于做一件事。

你可能經(jīng)常在項(xiàng)目中使用Gulp來做項(xiàng)目的代碼構(gòu)建,那么在使用過程中,你很可能碰到過類似下面的錯誤。 錯誤大概是這樣個的:

stream.js:94throw er; // Unhandled stream error in pipe.

當(dāng)初次碰到這種錯誤的時(shí)候,你可能和我一樣對流的概念毫無頭緒,好在我們可以借助Google來尋找答案。 一個最佳的開始是用Google搜索“node stream”之類的關(guān)鍵字, 從而我們可以獲得stream-adventure這類的課程學(xué)習(xí)。

在Node.js的文檔中,流(Stream)的官方定義如下:

流是一個抽象接口,在Node.js中它借助于多種對象實(shí)現(xiàn)。例如,一個對HTTP服務(wù)器的請求是一個流, 可以是stdout。流是可讀的,可寫的,或兩者兼?zhèn)?。所有的流都是EventEmitter的實(shí)例。

也就是說,Node.js中的很多模塊都是用到了流,例如http和fs模塊。例如在文件系統(tǒng)模塊(fs)中, 我們可以通過流來讀寫文件數(shù)據(jù)的實(shí)例。由于數(shù)據(jù)是流,這就意味著在完成文件讀取之前, 從收到最初幾個字節(jié)開始,就可以對數(shù)據(jù)動作。這是Node.js中的一個常見模式:

可讀流

const fs = require('fs'); const stream = fs.ReadStream('name.txt'); stream.setEncoding('utf-8'); stream.on('data', chunk => {console.log('read some data'); }); stream.on('close', () => {console.log('all the data is read'); });

在上面的例子中,我們創(chuàng)建了一個可讀流,并在流讀取文件的過程中監(jiān)聽事件,在收到新數(shù)據(jù)時(shí)觸發(fā)事件數(shù)據(jù)。 當(dāng)文件讀取完成后觸發(fā)關(guān)閉事件。

此外,在流中,我們要負(fù)責(zé)按自己想要的方式使用數(shù)據(jù),所以我們必須在數(shù)據(jù)事件接收到數(shù)據(jù)的時(shí)候處理它。 如果想要讀區(qū)所有數(shù)據(jù),就必須將其拼接到一個變量中:

let data = '';stream.on('data', chunk => {data += chunk;console.log('read some data'); });

如果讀取的文件很大,這就會觸發(fā)多個data事件,這就需要開發(fā)者可以在以接收到數(shù)據(jù)的時(shí)候就做一些事情, 而不是等到整個文件都讀取完成。

可寫流

顯然,我們也可以創(chuàng)建可寫流以便寫數(shù)據(jù)。這意味著,只要一段簡單的腳本,就可以使用流讀入文件然后寫入另一文件:

const fs = require('fs'); let readStream = fs.ReadStream('name.txt'); let writeStream = fs.WriteStream('out.txt'); readStream.setEncoding('utf-8'); readStream.on('data', chunk => {writeStream.write(chunk); }); readStream.on('close', () => {writeStream.end(); });

在上面的例子中,當(dāng)接收到data事件的時(shí)候,我們便將數(shù)據(jù)寫入到可寫流writeStream中,這非常的高效, 因?yàn)橹灰獜目勺x文件接收到數(shù)據(jù)事件,數(shù)據(jù)就會被寫入文件。尤其是對大文件而言,不會被阻塞。因此, 對于網(wǎng)絡(luò)和文件系統(tǒng)中移動數(shù)據(jù)而言,流的方式非常的高效。

通過管道連接流

本質(zhì)上,流允許你講其他對象或程序連接在一起。你將某些輸入,然后讓它經(jīng)過流, 將它傳遞到另一個程序中。我比較喜歡拿水管來做類比。將一組小型的管道(程序)連接在一起, 用于完成一些特定的任務(wù)。

管道(pipe)的概念很早就存在于Unix系統(tǒng)中,你可以通過這篇文章了解更多:Unix Pipelines

由于在輸入和輸出之間通過管道傳輸數(shù)據(jù)在Node.js中很常見,所以它也提供了連接兩個可讀和可寫流并在它們之間通過管道傳輸數(shù)據(jù)的方法。 例如:readStream.pipe(writeStream)。

pipe()方法會仔細(xì)處理事件,在需要的時(shí)候會暫停流并恢復(fù)流操作,所以除非需要對事件的發(fā)生有完全的控制權(quán), 否則應(yīng)該使用pipe()。

const fs = require('fs');// 指定讀取流,指向目標(biāo)文件,編碼格式為utf-8 const file = fs.createReadStream('hello.txt', {encoding: 'utf-8'});// 流是EventEmitter的實(shí)例,我們可以為其添加事件 // 當(dāng)打開文件時(shí)觸發(fā)open事件 file.on('open', function () {// 使用管道,將文件內(nèi)容輸出到屏幕上// process對象也是一個EventEmitter實(shí)例this.pipe(process.stdout); });

References

  • Introduction to streams
  • Hack Reactor’s Video About Node Streams
  • Stream (Node.js)
  • File System (Node.js)
  • Node Streams Article by Max Ogden
  • 總結(jié)

    以上是生活随笔為你收集整理的认识Node.js中流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。