node.js使用stream模块实现自定义流示例
本文实例讲述了node.js使用stream模块实现自定义流。分享给大家供大家参考,具体如下:
有些时候我们需要自定义一些流,来操作特殊对象,node.js中为我们提供了一些基本流类。
我们新创建的流类需要继承四个基本流类之一(stream.Writeable,stream.Readable,stream.Duplex,stream.Transform),并确保调用了父类构造函数。
一、实现自定义的可读流
实现可读流需继承stream.Readable,并实现readable._read()方法。
下面的代码我们实现了一个从数组中读取数据的流
const{Readable}=require('stream'); //这里我们自定义了一个用来读取数组的流 classArrReadextendsReadable{ constructor(arr,opt){ //注意这里,需调用父类的构造函数 super(opt); this.arr=arr; this.index=0; } //实现_read()方法 _read(size){ //如果当前下标等于数组长度,说明数据已经读完 if(this.index==this.arr.length){ this.push(null); }else{ this.arr.slice(this.index,this.index+size).forEach((value)=>{ this.push(value.toString()); }); this.index+=size; } } } letarr=newArrRead([1,2,3,4,5,6,7,8,9,0],{ highWaterMark:2 }); //这样当我们监听'data'事件时,流会调用我们实现的_read()方法往缓冲区中读取数据 //然后提供给消费者 arr.on('data',function(data){ console.log(data.toString()); });
二、实现自定义的可写流
实现可写流必须继承stream.Writeable,并实现writeable._write()方法。writable._writev()方法是可选的。
const{Writable}=require('stream'); //这里我们自定义了一个用来写入数组的流 classArrWriteextendsWritable{ constructor(arr,opt){ super(opt); this.arr=arr; } //实现_write()方法 _write(chunk,encoding,callback){ this.arr.push(chunk.toString()); callback(); } } letdata=[]; letarr=newArrWrite(data,{ highWaterMark:3 }); arr.write('1'); arr.write('2'); arr.write('3'); console.log(data);
三、实现自定义的可读可写流
可读可写流必须继承stream.Duplex,并实现readable._read()和writable._write()方法。
const{Duplex}=require('stream'); //这里我们自定义了一个用来写读可写数组的流 classArrReadWriteextendsDuplex{ constructor(arr,opt){ super(opt); this.arr=arr; this.index=0; } //实现_write()方法 _write(chunk,encoding,callback){ this.arr.push(chunk.toString()); callback(); } //实现_read()方法 _read(size){ //如果当前下标等于数组长度,说明数据已经读完 if(this.index==this.arr.length){ this.push(null); }else{ this.arr.slice(this.index,this.index+size).forEach((value)=>{ this.push(value.toString()); }); this.index+=size; } } } letdata=[]; letarrWR=newArrReadWrite(data,{ highWaterMark:3 }); //往流中写入数据 arrWR.write('1'); arrWR.write('2'); arrWR.write('3'); console.log(data); //往流中读取数据 console.log(arrWR.read(2).toString()); console.log(arrWR.read(2).toString());
四、自定义的转换流
转换流必须继承stream.Transform,需实现transform._transform()方法。
const{Transform}=require('stream'); //这里我们自定义了一个用来转换数组的流 classTransextendsTransform{ constructor(opt){ super(opt); } _transform(chunk,encoding,callback){ //将转换后的数据输出到可读流 this.push(chunk.toString().toUpperCase()); //参数一是Error对象 //参数二如果传入,会被转发到readable.push() callback(); } } lett=newTrans({ highWaterMark:3 }); t.on('data',function(data){ console.log(data.toString()); }); t.write('a'); t.write('b'); t.write('c');
转换流就是将读取到的数据做些计算然后输出。转换流既可以作为可读流,又可以作为可写流。
const{Transform}=require('stream'); //这里我们自定义了一个用来转换数组的流 classTransextendsTransform{ constructor(opt){ super(opt); } _transform(chunk,encoding,callback){ //将转换后的数据输出到可读流 this.push(chunk.toString().toUpperCase()); //参数一是Error对象 //参数二如果传入,会被转发到readable.push() callback(); } } lett=newTrans({ highWaterMark:3 }); t.on('data',function(data){ console.log('data',data.toString()); }); //stdin.pipe(t)表示将我们的标准输入写入到我的转换流t中,此时t是可写流。 //pipe(process.stdout)表示将转换流t中的数据读取到标准输出中,此时t是可读流。 process.stdin.pipe(t).pipe(process.stdout);
希望本文所述对大家node.js程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。