NodeJS实现自定义流的方法
前端之家收集整理的这篇文章主要介绍了
NodeJS实现自定义流的方法,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@
前言
<p style="text-align: center">

@H_
502_0@常见的
自定义流有四种,Readable(可读流)、Writable(可写流)、Duplex(双工流)和 Transform(转换流),常见的
自定义流应用有 HTTP 请求、响应, crypto 加密,进程 stdin 通信等等。
@H_
5020@stream 模块介绍
@H502_0@在 NodeJS 中要想实现
自定义流,需要依赖模块 stream ,直接引入,不需下载,所有种类的流都是继承这个模块内部提供的对应不同种类的类来实现的。
@H_
502_0@
实现一个自定义可读流 Readable
@H_
502_0@
1、创建自定义可读流的类 MyRead
@H_
502_0@实现
自定义可读流需创建一个类为 MyRead ,并继承 stream 中的 Readable 类,重写 _read
方法,这是所有
自定义流的固定套路。
<div class="jb51code">
<pre class="brush:js;">
let { Readable } = require("stream");
// 创建自定义可读流的类
class MyRead extends Readable {
constructor() {
super();
this.index = 0;
}
// 重写自定义的可读流的 _read 方法
_read() {
this.index++;
this.push(this.index + "");
if (this.index === 3) {
this.push(null);
}
}
}
@H_
502_0@我们自己写的 _read
方法会先查找并执行,在读取时使用 push
方法将数据读取出来,直到 push 的值为 null 才会停止,否则会认为没有读取完成,会继续
调用 _read 。
@H_
502_0@
2、验证自定义可读流
myRead.on("data",data => {
console.log(data);
});
myRead.on("end",function() {
console.log("读取完成");
});
// <Buffer 31>
// <Buffer 32>
// <Buffer 33>
// 读取完成
@H_
502_0@
实现一个自定义可写流 Writable
@H_
502_0@
1、创建自定义可写流的类 MyWrite
@H_
502_0@创建一个类名为 MyWrite ,并继承 stream 中的 Writable 类,重写 _write
方法。
自定义可写流的类
class MyWrite extends Writable {
// 重写
自定义的可写流的 _write
方法
_write(chunk,encoding,callback)) {
callback(); // 将缓存区写入
文件
}
}
@H_
502_0@写入
内容时默认第一次写入直接写入
文件,后面的写入都写入缓存区,如果不
调用 callback 只能默认第一次写入
文件,
调用 callback 会将缓存区清空并写入
文件。
@H_
502_0@
2、验证自定义可写流
{
console.log("hello ok");
});
myWrite.write("world",() => {
console.log("world ok");
});
// hello ok
// world ok
@H_
502_0@
实现一个自定义双工流 Duplex
@H_
502_0@
1、创建自定义可双工流的类 MyDuplex
@H_
502_0@双工流的可以理解为即可读又可写的流,创建一个类名为 MyDuplex ,并继承 stream 中的 Duplex 类,由于双工流即可读又可写,需重写 _read 和 _write
方法。
自定义双工流的类
class MyDuplex extends Duplex {
// 重写
自定义的双工流的 _read
方法
_read() {
this.push("123");
this.push(null);
}
// 重写
自定义的双工流的 _write
方法
_write(chunk,callback)) {
callback();
}
}
@H_
502_0@双工流分别具备 Readable 和 Writable 的
功能,但是读和写互不影响,互不关联。
@H_
502_0@
2、验证自定义双工流
{
console.log(myDuplex.read(1),"----");
});
setTimeout(() => {
myDuplex.on("data",data => {
console.log(data,"xxxx");
});
},3000);
// ----
// xxxx
// ----
// xxxx
@H_
502_0@如果 readable 和 data 两种读取方式都使用默认先通过 data 事件读取,所以一般只选择一个,不要同时使用,可读流的特点是读取数据被消耗掉后就丢失了(缓存区被清空),如果非要两个都用可以加一个定时器(绝对不要这样写)。
@H_
502_0@
实现一个自定义转化流 Transform
@H_
502_0@
1、创建自定义可转化流的类 MyTransform
@H_
502_0@转化流的意思是即可以当作可读流,又可以当作可写流,创建一个类名为 MyTransform ,并继承 stream 中的 Transform 类,重写 _transform
方法,该
方法的参数和 _write 相同。
自定义转化流的类
class MyTransform extends Transform {
// 重写
自定义的转化流的 _transform
方法
_transform(chunk,callback)) {
console.log(chunck.toString.toUpperCase());
callback();
this.push('123');
}
}
@H_
502_0@在
自定义转化流的 _transform
方法中,读取数据的 push
方法和 写入数据的 callback 都可以使用。
@H_
502_0@
2、验证自定义转化流
@H_
502_0@打开命令行窗口执行 node demo.js ,然后输入 abc ,会在命令窗口
输出 ABC 和 123 ,其实转换流先作为一个可写流被写入到标准输入中,而此时 stdin 的作用是读流,即读取
用户的输入,读取后转换流作为一个可读流
调用 pipe ,将
用户输入的信息通过标准
输出写到命令行窗口,此时 stdout 的作用是写流。
@H_
502_0@
总结
@H_
502_0@以上所述是小编给大家介绍的NodeJS实现
自定义流。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可
分享给好友!感谢
支持。