了解nodeJs中的流(stream)

2021-09-11 14:21:10 字數 1848 閱讀 3728

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種:

可讀流(readable)

可寫流(writable )

既能讀又能寫(duplex )

其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是eventemitter的例項,

也就是有傳送事件和處理事件的能力。

複製**

可讀流 readable stream

可讀流可以輸出資料,常見的可讀流有:

http請求和響應

讀檔案壓縮解壓

加密解密

tcp sockect

程序輸入

複製**

可讀流分為兩種模式:流式的和非流式的,區別就是前者會盡快保證資料可用,而後者則是只有等到你主動呼叫stream.read()之後才可用。

剛才說過,所有的流都是eventemitter的例項,它本身也有一些內建的事件,readablestream有的事件包括:

readable: 流中的資料已經準備就緒

data: 有資料到來,對應flowing模式

end: 沒有更多的資料了

close: 有關的資源如檔案描述符被關閉時觸發

error: 接收資料時發生錯誤

複製**

另外還有一些方法介面:

read([size]): 主動的拉取一定的資料,如果沒有資料,則返回null,如果size不傳,則返回所有可用的資料。

該方法只能在non-flowing模式下呼叫

setencoding(encoding): 使用什麼樣的編碼格式進行解析

pause(): 停止傳送data事件,新來的資料會保留到內部的buffer中

resume(): 對應上個事件,恢復data事件的傳送

pipe(destination, [option]):從流中拉取資料,並寫入到destination流中,因為返回的是destination流,

因此可以使用鏈式操作;預設情況下,讀取流關閉後寫入流也被關閉

unpipe([destination]): 將pipe方法設定的寫入規則移除掉,如果不傳入destination,則移除所有的流

unshift(chunk): 可以想象為把吐出來的東西再吃進去,這裡就是把讀取出來的部分或全部內容再次放到可讀流中

wrap(stream): 對老式的流進行包裝

複製**

可寫流 writable stream

同樣的,可寫流有事件和方法兩部分,事件包括:

drain: 表明資料還沒有寫完,write方法呼叫返回false

finish: 所有的資料都寫入完畢

pipe: 當乙個讀取流呼叫pipe方法指向當前寫入流

unpipe: 當乙個讀取流呼叫unpipe方法將當前寫入流撤銷時

error: 寫入出現錯誤時

複製**

方法:

write(chunk,[encoding],[callback]): 寫入資料,當資料必須要在內部被緩衝時,返回false

end([chunk],[encoding],[callback]): 寫完之後就終止新的寫入了

複製**

可讀寫流

duplex: 全雙工的流,可讀可寫

transform: 從input中讀取流資料,進行處理後寫入到output流中

複製**

(由於本次時間較緊,後續會寫一些**放上來進一步了解深入)

了解nodeJs中的流(stream)

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...

了解nodeJs中的流(stream)

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...

nodejs中需了解的http協議

http的狀態碼 http工作原理 http客戶端和伺服器端 第三部分 空行,請求頭部後面的空行是必須的 第四部分 請求資料也叫主體,可以新增任意的其他資料。get請求沒有請求體,所以空行也沒有意義 get請求的結構 請求首行 請求方式 資源路徑?查詢字串 協議名 協議版本 get請求通過查詢字串傳...