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 |









