可读流模拟实现constfs=require("fs");constEventEmitter=require("events");classMyFileReadStreamextendsEventEmitter{constructor(path,options={}){super();this.path=路径;this.flag=options.flags||“r”;this.mode=options.mode||438;this.autoClose=options.autoClose||真的;this.start=options.start||0;this.end=options.end;this.highWaterMark=options.highWaterMark||64*1024;this.readOffset=0;这个.open();this.on("newListener",(type)=>{//判断监听类型console.log(type);if(type==="data"){this.read();}});}open(){//原open方法打开指定位置文件fs.open(this.path,this.flags,this.mode,(err,fd)=>{if(err){this.emit("error",err);}else{this.fd=fd;this.emit("open",fd);//发送文件标识符}});}read(){//这里不能直接获取fd,这里监听open时间,控制执行顺序if(typeofthis.fd!=="number"){returnthis.once("open",this.read);}让buf=Buffer.alloc(this.highWaterMark);让howMuchToRead;//用户设置结束值howMuchToRead=this.end?Math.min(this.end-this.readOffset+1,this.highWaterMark):this.highWaterMark;fs.read(this.fd,buf,0,howMuchToRead,this.readOffset,(err,readBytes)=>{if(readBytes){this.readOffset+=readBytes;this.emit("数据",buf.slice(0,readBytes));//返回数据this.read();//继续阅读}else{this.emit("end");this.close();}});}close(){fs.close(this.fd,()=>{this.emit("close");});}//管道简化操作pipe(ws){this.on("data",(data)=>{letflag=ws.write(data);if(!flag){this.pause();}});ws.on("drain",()=>{this.resume();});}}letrs=newMyFileReadStream("test.txt",{end:7,highWaterMark:3,});//事件触发测试//rs.on("open",(fd)=>{//console.log("open",fd);//});//rs.on("error",(err)=>{///console.log(err);//});rs.on("data",(chunk)=>{console.log(chunk);});//rs.on("end",()=>{//console.log("end");//});rs.on("close",()=>{console.log("close");});可写流模拟现实constfs=require("fs");constEventEmitter=require("events");const{Queue}=require("./linkedList");//队列类MyWriteStreamextendsEventEmitter{constructor(path,options={}){super();this.path=path;this.flags=options.flags||“w”;this.mode=options.mode||438;this.autoClose=options.autoClose||true;this.start=options.start||0;this.encoding=options.编码||“utf8”;this.highWaterMark=options.highWaterMark||16*1024;这个.open();this.writeOffset=this.start;this.writing=false;//标识符是否正在写入this.writLen=0;this.needDrain=false;this.cache=newQueue();}open(){//原生fs.openfs.open(this.path,this.flags,(err,fd)=>{if(err){this.emit("error",err);}//正常打开文件this.fd=fd;this.emit("open",fd);});}write(chunk,encoding,cb){chunk=Buffer.isBuffer(chunk)?块:Buffer.from(块);//只考虑string或Buffer两种类型this.writLen+=chunk.length;让flag=this.writLen
