NodeJS實(shí)現(xiàn)自定義流的方法
前言

常見(jiàn)的自定義流有四種,Readable(可讀流)、Writable(可寫(xiě)流)、Duplex(雙工流)和 Transform(轉(zhuǎn)換流),常見(jiàn)的自定義流應(yīng)用有 HTTP 請(qǐng)求、響應(yīng), crypto 加密,進(jìn)程 stdin 通信等等。
stream 模塊介紹
在 NodeJS 中要想實(shí)現(xiàn)自定義流,需要依賴(lài)模塊 stream ,直接引入,不需下載,所有種類(lèi)的流都是繼承這個(gè)模塊內(nèi)部提供的對(duì)應(yīng)不同種類(lèi)的類(lèi)來(lái)實(shí)現(xiàn)的。
實(shí)現(xiàn)一個(gè)自定義可讀流 Readable
1、創(chuàng)建自定義可讀流的類(lèi) MyRead
實(shí)現(xiàn)自定義可讀流需創(chuàng)建一個(gè)類(lèi)為 MyRead ,并繼承 stream 中的 Readable 類(lèi),重寫(xiě) _read 方法,這是所有自定義流的固定套路。
let { Readable } = require("stream");
// 創(chuàng)建自定義可讀流的類(lèi)
class MyRead extends Readable {
constructor() {
super();
this.index = 0;
}
// 重寫(xiě)自定義的可讀流的 _read 方法
_read() {
this.index++;
this.push(this.index + "");
if (this.index === 3) {
this.push(null);
}
}
}
我們自己寫(xiě)的 _read 方法會(huì)先查找并執(zhí)行,在讀取時(shí)使用 push 方法將數(shù)據(jù)讀取出來(lái),直到 push 的值為 null 才會(huì)停止,否則會(huì)認(rèn)為沒(méi)有讀取完成,會(huì)繼續(xù)調(diào)用 _read 。
2、驗(yàn)證自定義可讀流
let myRead = new MyRead();
myRead.on("data", data => {
console.log(data);
});
myRead.on("end", function() {
console.log("讀取完成");
});
// <Buffer 31>
// <Buffer 32>
// <Buffer 33>
// 讀取完成
實(shí)現(xiàn)一個(gè)自定義可寫(xiě)流 Writable
1、創(chuàng)建自定義可寫(xiě)流的類(lèi) MyWrite
創(chuàng)建一個(gè)類(lèi)名為 MyWrite ,并繼承 stream 中的 Writable 類(lèi),重寫(xiě) _write 方法。
let { Writable } = require("stream");
// 創(chuàng)建自定義可寫(xiě)流的類(lèi)
class MyWrite extends Writable {
// 重寫(xiě)自定義的可寫(xiě)流的 _write 方法
_write(chunk, encoding, callback)) {
callback(); // 將緩存區(qū)寫(xiě)入文件
}
}
寫(xiě)入內(nèi)容時(shí)默認(rèn)第一次寫(xiě)入直接寫(xiě)入文件,后面的寫(xiě)入都寫(xiě)入緩存區(qū),如果不調(diào)用 callback 只能默認(rèn)第一次寫(xiě)入文件,調(diào)用 callback 會(huì)將緩存區(qū)清空并寫(xiě)入文件。
2、驗(yàn)證自定義可寫(xiě)流
let myWrite = new MyWrite();
myWrite.write("hello", "utf8", () => {
console.log("hello ok");
});
myWrite.write("world", "utf8", () => {
console.log("world ok");
});
// hello ok
// world ok
實(shí)現(xiàn)一個(gè)自定義雙工流 Duplex
1、創(chuàng)建自定義可雙工流的類(lèi) MyDuplex
雙工流的可以理解為即可讀又可寫(xiě)的流,創(chuàng)建一個(gè)類(lèi)名為 MyDuplex ,并繼承 stream 中的 Duplex 類(lèi),由于雙工流即可讀又可寫(xiě),需重寫(xiě) _read 和 _write 方法。
let { Duplex } = require("stream");
// 創(chuàng)建自定義雙工流的類(lèi)
class MyDuplex extends Duplex {
// 重寫(xiě)自定義的雙工流的 _read 方法
_read() {
this.push("123");
this.push(null);
}
// 重寫(xiě)自定義的雙工流的 _write 方法
_write(chunk, encoding, callback)) {
callback();
}
}
雙工流分別具備 Readable 和 Writable 的功能,但是讀和寫(xiě)互不影響,互不關(guān)聯(lián)。
2、驗(yàn)證自定義雙工流
let myDuplex = new MyDuplex();
myDuplex.on("readable", () => {
console.log(myDuplex.read(1), "----");
});
setTimeout(() => {
myDuplex.on("data", data => {
console.log(data, "xxxx");
});
}, 3000);
// <Buffer 31> ----
// <Buffer 32> xxxx
// <Buffer 32> ----
// <Buffer 33> xxxx
如果 readable 和 data 兩種讀取方式都使用默認(rèn)先通過(guò) data 事件讀取,所以一般只選擇一個(gè),不要同時(shí)使用,可讀流的特點(diǎn)是讀取數(shù)據(jù)被消耗掉后就丟失了(緩存區(qū)被清空),如果非要兩個(gè)都用可以加一個(gè)定時(shí)器(絕對(duì)不要這樣寫(xiě))。
實(shí)現(xiàn)一個(gè)自定義轉(zhuǎn)化流 Transform
1、創(chuàng)建自定義可轉(zhuǎn)化流的類(lèi) MyTransform
轉(zhuǎn)化流的意思是即可以當(dāng)作可讀流,又可以當(dāng)作可寫(xiě)流,創(chuàng)建一個(gè)類(lèi)名為 MyTransform ,并繼承 stream 中的 Transform 類(lèi),重寫(xiě) _transform 方法,該方法的參數(shù)和 _write 相同。
let { Transform } = require('stream');
// 創(chuàng)建自定義轉(zhuǎn)化流的類(lèi)
class MyTransform extends Transform {
// 重寫(xiě)自定義的轉(zhuǎn)化流的 _transform 方法
_transform(chunk, encoding, callback)) {
console.log(chunck.toString.toUpperCase());
callback();
this.push('123');
}
}
在自定義轉(zhuǎn)化流的 _transform 方法中,讀取數(shù)據(jù)的 push 方法和 寫(xiě)入數(shù)據(jù)的 callback 都可以使用。
2、驗(yàn)證自定義轉(zhuǎn)化流
// demo.js let myTransForm = new MyTransform(); // 使用標(biāo)準(zhǔn)輸入 process.stdin.pipe(myTransForm).pipe(process.stdin);
打開(kāi)命令行窗口執(zhí)行 node demo.js ,然后輸入 abc ,會(huì)在命令窗口輸出 ABC 和 123 ,其實(shí)轉(zhuǎn)換流先作為一個(gè)可寫(xiě)流被寫(xiě)入到標(biāo)準(zhǔn)輸入中,而此時(shí) stdin 的作用是讀流,即讀取用戶(hù)的輸入,讀取后轉(zhuǎn)換流作為一個(gè)可讀流調(diào)用 pipe ,將用戶(hù)輸入的信息通過(guò)標(biāo)準(zhǔn)輸出寫(xiě)到命令行窗口,此時(shí) stdout 的作用是寫(xiě)流。
總結(jié)
以上所述是小編給大家介紹的NodeJS實(shí)現(xiàn)自定義流,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 使用nodeJS中的fs模塊對(duì)文件及目錄進(jìn)行讀寫(xiě),刪除,追加,等操作詳解
- NodeJs 文件系統(tǒng)操作模塊fs使用方法詳解
- 詳解nodeJs文件系統(tǒng)(fs)與流(stream)
- 詳解Nodejs 通過(guò) fs.createWriteStream 保存文件
- Nodejs讀取文件時(shí)相對(duì)路徑的正確寫(xiě)法(使用fs模塊)
- NodeJS學(xué)習(xí)筆記之FS文件模塊
- nodejs文件操作模塊FS(File System)常用函數(shù)簡(jiǎn)明總結(jié)
- 詳解nodejs 文本操作模塊-fs模塊(一)
- 詳解nodejs 文本操作模塊-fs模塊(二)
- 如何在Nodejs中使用模塊fs文件系統(tǒng)
相關(guān)文章
nodejs異步編程基礎(chǔ)之回調(diào)函數(shù)用法分析
這篇文章主要介紹了nodejs異步編程基礎(chǔ)之回調(diào)函數(shù)用法,結(jié)合具體實(shí)例形式分析了阻塞與非阻塞形式下回調(diào)函數(shù)具體功能、使用技巧,需要的朋友可以參考下2018-12-12
Sublime Text3 配置 NodeJs 環(huán)境的方法
大家都知道,Sublime Text 安裝插件一般從 Package Control 中直接安裝即可,當(dāng)我安裝 node js 插件時(shí)候,直接通過(guò)Package Control 安裝,雖然插件安裝成功了,但是找不到配置文件 Nodejs.sublime-build 來(lái)更改一些配置2020-05-05
koa+mongoose實(shí)現(xiàn)簡(jiǎn)單增刪改查接口的示例代碼
這篇文章主要介紹了koa+mongoose實(shí)現(xiàn)簡(jiǎn)單增刪改查接口的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05
node.js文件系統(tǒng)模塊和兩個(gè)重要模塊
這篇文章主要介紹了node.js文件系統(tǒng)模塊和兩個(gè)重要模塊,nodejs是JavaScript的后端運(yùn)行環(huán)境,并對(duì)node.js的fs文件系統(tǒng)模塊做了簡(jiǎn)單的介紹,需要的小伙伴可以參考一下2022-06-06
nodejs實(shí)例解析(輸出hello world)
本文主要介紹nodejs實(shí)例解析:輸出hello world的完整過(guò)程。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-01-01

