浅谈Node.js:理解stream

2020-06-17 07:07:32易采站长站整理


function copy(src,dest){
src = path.resolve(src);
dest = path.resolve(dest);
const rs = fs.createReadStream(src);
const ws = fs.createWriteStream(dest);
console.log('正在复制中...');
const stime = +new Date();
rs.on('data',(chunk)=>{
if(null === ws.write(chunk)){
rs.pause();
}
});
ws.on('drain',()=>{
rs.resume();
});
rs.on('end',()=>{
const etime = +new Date();
console.log(`已完成,用时:${(etime-stime)/1000}秒`);
ws.end();
});
function calcProgress(){

}
}
copy('./CSS权威指南 第3版.pdf','./javascript.pdf');

drain事件

如果

Writable.write()
方法返回false,则drain事件将会被触发,上面的背压机制已经使用了该事件。

finish事件

在调用

stream.end()
方法之后且所有缓存区的数据都被写入到下游系统,就会触发该事件,如下所示:


const ws = fs.createWriteStream('./alphabet.txt');
const alphabetStr = 'abcdefghijklmnopqrstuvwxyz';
ws.on('finish',()=>{
console.log('done.');
});
for(let letter of alphabetStr.split()){
ws.write(letter);
}
ws.end();//必须调用

end([chunk][, encoding][, callback])方法

end()
方法被调用之后,便不能再调用
stream.write()
方法写入数据,负责将抛出错误。

3、Duplex读写流

Duplex流同时实现了Readable与Writable类的接口,既是可读流,也是可写流。例如’zlib streams’、’crypto streams’、’TCP sockets’等都是Duplex流。

4、Transform流

Duplex流的扩展,区别在于,Transform流自动将写入端的数据变换后添加到可读端。例如:’zlib streams’、’crypto streams’等都是Transform流。

5、四种流的实现

stream
模块提供的API可以让我们很简单的实现流,该模块使用
require('stream')
引用,我们只要继承四种流中的一个基类
(stream.Writable, stream.Readable, stream.Duplex, or stream.Transform)
,然后实现它的接口就可以了,需要实现的接口如下所示:

| Use-case | Class | Method(s) to implement |
 | ————- |————-| —–|
 | Reading only | Readable | _read |
 | Writing only | Writable | _write, _writev |
 | Reading and writing | Duplex | _read, _write, _writev |