createReadStream

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')
		})
	}
}



版权声明:本文为lning52yx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。