当前位置: 首页 > 后端技术 > Node.js

使用流式读写文件来处理大文件

时间:2023-04-03 15:39:49 Node.js

处理大文件读写流streamfs.createReadStreamcreateReadStream是fs模块中读取流的方法createReadStream读取文件,有两个参数第一个参数是读取文件的路径第二个参数highWaterMark最高水位线,默认maximumread64K读类内容是buffer类型,返回的结果是一个可读流的实例,是非流式模式---在切换到流式模式之前,我们必须先定义我们读流的变量,假设我们有一个1.txt文件,我们要读取1.txt中的内容,我们先设置最高水印线每次读取1kletrs=fs.createReadStream('./1.txt',{highWaterMark:1})在我们的rs中有Binding两个事件方法data和endfs.createWriteStreamconstfs=require('fs');constpath=require('路径');letreadPath=path.join(__dirname,`./dist/my.txt`);letcopyPath=path.join(__dirname,'./dist/my.txt');//实现每次实时写入文件被读取,将新的缓冲区存储到数组中,然后将其转换为buffersave(`--:secondSecondaddition:--`);asyncfunctionsave(value){//读取文件constlocalBufArr=awaitreadFileStream(readPath);lettotalLength=0;//添加新缓冲区localBufArr.push(newBuffer(value,['utf8']));localBufArr.map(v=>{totalLength+=v.length})//缓冲区合并letbuf=Buffer.concat(localBufArr,totalLength);//缓冲区合并将数组缓冲区转换为整个缓冲区console.log('buf',buf);//创建一个可写流letfirstCreate=fs.creatWriteStream(copyPath);//写入缓冲区firstCreate.write(buf);}//使用流函数读取文件readFileStream(spath){returnnewPromise((resolve,reject)=>{//判断文件是否存在if(fs.existsSync(spath)){letreadStream=fs.createReadStream(spath);letarr=[];letstartTime=Date.now();//内部触发rs.emit('data',data);数据不可更改,开启保留模式后,数据会疯狂触发data事件readStream.on('data',function(chunk){//chunk是buffer类型arr.push(chunk)})//监听文件已经读完,会自动触发结束事件,没有读到则不会触发readStream.on('end',function(chunk){letuseTime=Date.now()-startTime;console.log("Forreadingfiles"+(useTime/1000)+"s")resolve(arr)})//监听错误readStream.on('error',function(err){console.log(err);})}else{reject("NoChangefile")}})}