关于流模式乱码
const fs=require(‘fs‘); var rs=fs.createReadStream(‘1.txt‘); var str=‘‘; rs.on(‘data‘,function(chunk){ str+=chunk;//此处内置处理机制 str=str.toString()+chunk.toString() console.log(chunk)//chunk是buffer对象 }) rs.on(‘end‘,function(){ console.log(str)//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少 }) var rs1=fs.createReadStream(‘1.txt‘,{highWaterMark:11}); var str1=‘‘;//设置流模式每次读取10个字节 一个汉字三个字节 发生乱码 rs1.on(‘data‘,function(chunk1){ str1+=chunk1; console.log(chunk1) }) rs1.on(‘end‘,function(){ console.log(str1) }) /* <Buffer a7 89 e6 99 93 ef bc 8c e5 a4> <Buffer 84 e5 a4 84 e9 97 bb e5 95 bc> <Buffer e9 b8 9f 3b e5 a4 9c e6 9d a5> <Buffer e9 a3 8e e9 9b a8 e5 a3 b0 ef> <Buffer bc 8c e8 8a b1 e8 90 bd e7 9f> <Buffer a5 e5 a4 9a e5 b0 91 e3 80 82> 春眠不???晓,??处闻啼鸟;夜来风雨声???花落??多少。 */
解决办法1,流模式自带设置编码格式
const fs=require(‘fs‘); var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11}); rs.setEncoding(‘utf-8‘); var str=‘‘; rs.on(‘data‘,function(chunk){ str+=chunk;//此处内置处理机制 str=str.toString()+chunk.toString() console.log(chunk)//chunk是buffer对象 }) rs.on(‘end‘,function(){ console.log(str)//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少 }) // 春眠不 // 觉晓,处 // 处闻啼鸟 // ;夜来风 // 雨声,花 // 落知多 // 少。 // 春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。
解决方案2,buffer对象拼接
const fs=require(‘fs‘); const iconv=require(‘iconv-lite‘); var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11}); var str=‘‘; var size=0; var chunks=[]; rs.on(‘data‘,function(chunk){ chunks.push(chunk);//将每次读取的buffer对象放入数组 size+=chunk.length;//统计所有元素的个数 }) rs.on(‘end‘,function(){ var buf=Buffer.concat(chunks,size);//合并成一个大buffer对象 console.log(iconv.decode(buf,‘utf-8‘))//用iconv转换 })//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。
解决方案3,自己拼接
const fs=require(‘fs‘); const iconv=require(‘iconv-lite‘); var rs=fs.createReadStream(‘1.txt‘,{highWaterMark:11}); var str=‘‘; var size=0; var chunks=[]; var n=0; rs.on(‘data‘,function(chunk){ chunks.push(chunk);//将每次读取的buffer对象放入数组 size+=chunk.length; }) rs.on(‘end‘,function(){ var buf=new Buffer(size); chunks.forEach(function(e){ for(let i=0;i<e.length;i++){ buf[n]=e[i]; n++; } }) console.log(iconv.decode(buf,‘utf-8‘)) })//春眠不觉晓,处处闻啼鸟;夜来风雨声,花落知多少。
highWaterMark的值越大,文件读取速度越快
时间: 2024-10-06 00:53:56