node.js 从文件流中读写数据及管道流
读取数据
// 引入 fs 模块 const fs = require('fs'); // 创建可读流 let readStream = fs.createReadStream('index.txt'); // 保存数据 let str = '' // 读取次数 let count = 0; // 处理流事件 data - 当有数据可读时触发。 readStream.on('data',(chunk)=>{ str += chunk; count++; }) // end - 没有更多的数据可读时触发。 readStream.on('end',(chunk)=>{ console.log(str) console.log(count); }) // error - 在接收和写入过程中发生错误时触发。 readStream.on('error',(err)=>{ console.log(err); })
结果如下:
成功读取到文本内容,且文件较大时,会分次读取,这里分两次读取
写入数据
const fs = require('fs'); let data = '我是从数据库获取的数据,我要以文件流的方式保存起来\n'; // 创建一个可以写入的流,写入到文件 output.txt 中 let writeStream = fs.createWriteStream('output.txt'); for(let i = 0;i < 100; i++){ writeStream.write(data,'utf8'); } // 标记写入完成 writeStream.end(); writeStream.on('finish',()=>{ console.log('写入完成'); }) writeStream.on('error',()=>{ console.log('写入失败'); })
output.txt 文件写入了 100 条数据
注意: end() 方法 会触发 finish 方法,如果不标记 end , 则无法触发 finish 方法,所以,建议大家写入完成标记end
管道流:
针对大型文件的复制
const fs = require('fs'); // 创建一个可读流 let readStream = fs.createReadStream('index.txt'); // 创建一个可写流 let writeStream = fs.createWriteStream('output.txt'); // 管道读写操作 // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中 readStream.pipe(writeStream); console.log('执行完毕');