let fs= require('fs');
let event = require('events');
class CreateReadStream extends event {
constructor(path,options={}){
super();
//文件
this.path= path;
this.flags =options.flags||'r';
this.autoClose=options.autoClose||true;
this.encoding =options.encoding||'utf8';
this.highWaterMark = options.highWaterMark||64*1024;
//开始读得位置
this.start=options.start||0;
this.end=option.end||null;
// 是否是流动模式
this.flowing = null;
//读取文件的位置
this.pos=this.start;
this.on('newListener',(type)=>{
if(type =='data'){
// 监听data 就会触发流动模式
this.flowing = true;
this.open();
this.read();
}
})
}
open(){
fs.open(this.path,this.flags,(err,fd)=>{
if(err){
this.emit('error',err);
}
this.fd = fd;
this.emit('open',fd);
})
}
read(){
// fd 文件操作描述符
if(typeof this.fd ! == 'number'){
this.once('open',()=>this.open()}) ;
}
// 申请一段内存空间
let buffer = Buffer.alloc(this.highWaterMark);
let howToRead = this.end? this.end?Math.min((this.end-this.pos+1),this.highWaterMark):this.highWaterMark;
if(howToRead<=0){
this.flowing = false;
this.emit('end')
return this.close()
}
fs.read(this.fd,buffer,0,howToRead,this.pos,(err,byteRead)=>{
this.pos +=byteRead;
if(byteRead>0){
this.emit('data',buffer.slice(0,byteRead));
//每次都向外发出 buffer 当前读取的这段
if(this.flowing){
this.read();
}
}
})
}
close(){
fs.close(this.fd,()=>{
this.emit('close')
})
}
}
createReadStream
最新推荐文章于 2024-04-13 06:26:04 发布