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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值