對nodejs中流的理解

一,為什么需要流芯砸?

????????當我們學習一個東西的時候萧芙,首先我們要知道為什么要學習?那我們?yōu)槭裁匆褂昧髂匾亦郑吭趎ode中讀取文件的方式有來兩種末购,一個是利用fs模塊,一個是利用流來讀取虎谢。如果讀取小文件盟榴,我們可以使用fs讀取,fs讀取文件的時候婴噩,是將文件一次性讀取到本地內存擎场。而如果讀取一個大文件,一次性讀取會占用大量內存几莽,效率很低迅办,這個時候需要用流來讀取。流是將數(shù)據(jù)分割段章蚣,一段一段的讀取站欺,效率很高。

二,流的概念

流是一種抽象的接口矾策,node中很多對象都對它進行了實現(xiàn)磷账。

所有流的對象都是EventEmitter的實例,都實現(xiàn)了EventEmitter的接口贾虽。

也就是流具有事件的能力逃糟,可以通過發(fā)射事件來反饋流的狀態(tài)。這樣我們就可以注冊監(jiān)聽流的事件蓬豁,來達到我們的目的绰咽。也就是我們訂閱了流的事件,這個事件觸發(fā)時地粪,流會通知我取募,然后我就可以做相應的操作了。

三驶忌,流的分類

????????Readable Stream :可讀數(shù)據(jù)流

????????Writeable Stream :可寫數(shù)據(jù)流

????????Duplex Stream :雙向數(shù)據(jù)流矛辕,可以同時讀和寫

????????Transform Stream: 轉換數(shù)據(jù)流,可讀可寫付魔,同時可以轉換(處理)數(shù)據(jù)

四,可讀流介紹

可讀流的兩種模式

可讀流有兩種模式:flowing和paused

1)在流動模式下飞蹂,可讀流自動從系統(tǒng)底層讀取數(shù)據(jù)几苍,并通過EventEmitter接口的事件盡快

將數(shù)據(jù)提供給應用。

2)在暫停模式下陈哑,必須顯示調用stream.read()方法來從流中讀取數(shù)據(jù)片段妻坝。

注意:如果可讀流切換到流動模式,并且沒有消費者處理流中的數(shù)據(jù)惊窖,這些數(shù)據(jù)將會丟失刽宪。

下面介紹Readable流有以下幾種事件:

   ? 1. 'Readable'事件

   ? 2. 'data'事件 - 數(shù)據(jù)正在傳遞時,觸發(fā)該事件(以chunk數(shù)據(jù)塊為對象)

   ? 3. 'end'事件 - 數(shù)據(jù)傳遞完成后界酒,會觸發(fā)該事件圣拄。

   ? 4. 'close'事件

   ? 5. 'error'事件

?所有這些事件都可以在官方API文檔中找到例子。我們可以監(jiān)聽流的這些事件毁欣,來完成相應操作庇谆。

我們來寫個小例子:

```

let fs = require('fs');

let ReadStream = require('./ReadStream');

let rs = ReadStream('./1.txt', {

? ? flags: 'r',

? ? encoding: 'utf8',

? ? start: 3,

? ? end: 7,

? ? highWaterMark: 3

});

rs.on('open', function () {

? ? console.log("open");

});

rs.on('data', function (data) {

? ? console.log(data);

});

rs.on('end', function () {

? ? console.log("end");

});

rs.on('close', function () {

? ? console.log("close");

});

/**

open

456

789

end

close

**/

```

五,可寫流介紹

常用的方法:

1凭疮,Writable流的write(chunk[,encoding] [,callback])方法可以把數(shù)據(jù)寫入流中饭耳。

其中,chunk是待寫入的數(shù)據(jù)执解,是Buffer或String對象寞肖。這個參數(shù)是必須的,其它參數(shù)都是可選的。如果chunk是String對象新蟆,encoding可以用來指定字符串的編碼格式觅赊,write會根據(jù)編碼格式將chunk解碼成字節(jié)流再來寫入。callback是數(shù)據(jù)完全刷新到流中時會執(zhí)行的回調函數(shù)栅葡。write方法返回布爾值茉兰,當數(shù)據(jù)被完全處理后返回true(不一定是完全寫入設備哦)。

2欣簇,Writable流的end([chunk] [,encoding] [,callback])方法可以用來結束一個可寫流规脸。它的三個參數(shù)都是可選的。chunk和encoding的含義與write方法類似熊咽。callback是一個可選的回調莫鸭,當你提供它時,它會被關聯(lián)到Writable的finish事件上横殴,這樣當finish事件發(fā)射時它就會被調用被因。

常用的事件:

drain事件:當一個流不處在 drain 的狀態(tài), 對 write() 的調用會緩存數(shù)據(jù)塊衫仑, 并且返回 false梨与。 一旦所有當前所有緩存的數(shù)據(jù)塊都排空了(被操作系統(tǒng)接受來進行輸出), 那么 'drain' 事件就會被觸發(fā)

finish事件:在調用了 stream.end() 方法文狱,且緩沖區(qū)數(shù)據(jù)都已經(jīng)傳給底層系統(tǒng)之后粥鞋, 'finish' 事件將被觸發(fā)。

我們來寫個小例子:

let fs = require('fs');

let FileWriteStream = require('./FileWriteStream');

let ws = FileWriteStream('./2.txt',{

? ? flags:'w',

? ? encoding:'utf8',

? ? highWaterMark:3

});

let i = 10;

function write(){

? ? let? flag = true;

? ? while(i&&flag){

? ? ? ? flag = ws.write("1",'utf8',(function(i){

? ? ? ? ? ? return function(){

? ? ? ? ? ? ? ? console.log(i);

? ? ? ? ? ? }

? ? ? ? })(i));

? ? ? ? i--;

? ? ? ? console.log(flag);

? ? }

}

write();

ws.on('drain',()=>{

? ? console.log("drain");

? ? write();

});

六瞄崇,緩存區(qū)

不管是可讀流還是可寫流都會將數(shù)據(jù)存儲到內部的緩沖器中呻粹。

緩沖器的大小取決于傳遞給流構造函數(shù)的highWaterMark選項。對于普通的流苏研,highWaterMark

指定了總共的字節(jié)數(shù)等浊。對于工作在對象模式的流,指定了對象的總數(shù)摹蘑。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末筹燕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纹蝴,更是在濱河造成了極大的恐慌庄萎,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塘安,死亡現(xiàn)場離奇詭異糠涛,居然都是意外死亡,警方通過查閱死者的電腦和手機兼犯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門忍捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來集漾,“玉大人,你說我怎么就攤上這事砸脊【咂” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵凌埂,是天一觀的道長驱显。 經(jīng)常有香客問我,道長瞳抓,這世上最難降的妖魔是什么埃疫? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮孩哑,結果婚禮上栓霜,老公的妹妹穿的比我還像新娘。我一直安慰自己横蜒,他們只是感情好胳蛮,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丛晌,像睡著了一般仅炊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澎蛛,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天茂洒,我揣著相機與錄音,去河邊找鬼瓶竭。 笑死,一個胖子當著我的面吹牛渠羞,可吹牛的內容都是我干的斤贰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼次询,長吁一口氣:“原來是場噩夢啊……” “哼荧恍!你這毒婦竟也來了?” 一聲冷哼從身側響起屯吊,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤送巡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盒卸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骗爆,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年蔽介,在試婚紗的時候發(fā)現(xiàn)自己被綠了摘投。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煮寡。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖犀呼,靈堂內的尸體忽然破棺而出幸撕,到底是詐尸還是另有隱情,我是刑警寧澤外臂,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布坐儿,位于F島的核電站,受9級特大地震影響宋光,放射性物質發(fā)生泄漏貌矿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一跃须、第九天 我趴在偏房一處隱蔽的房頂上張望站叼。 院中可真熱鬧,春花似錦菇民、人聲如沸尽楔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阔馋。三九已至,卻和暖如春娇掏,著一層夾襖步出監(jiān)牢的瞬間呕寝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工婴梧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留下梢,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓塞蹭,卻偏偏與公主長得像孽江,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子番电,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內容

  • //公共引用 varfs =require('fs'), path =require('path'); 1岗屏、讀取文...
    才気莮孒閱讀 833評論 0 1
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,327評論 0 6
  • 流是Node中最重要的組件和模式之一。在社區(qū)里有一句格言說:讓一切事務流動起來漱办。這已經(jīng)足夠來描述在Node中流...
    宮若石閱讀 552評論 0 0
  • 今年芳齡20娩井,沒有進入踏入大學這一步暇屋,甚至高中也沒有,也許會有人覺得撞牢,一個知識文化都不夠深淵的人率碾,怎么配得...
    笑啊對一直笑閱讀 296評論 0 0
  • 重溫星際穿越所宰。 沒想到第二刷看到的不是科技绒尊,不是華麗麗的黑洞和多維世界的遐想。 當Cooper被困在五維世界里仔粥,只...
    ideaplay閱讀 257評論 6 1