解决大文件读写 流 stream
- fs.createReadStream
createReadStream 是 fs 模块外面读流的一个办法
createReadStream 读取文件,有两个参数
第一个参数,读取文件的门路
第二个参数 highWaterMark 最高水位线, 默认最多读取 64K
读取的类容都是 buffer 类型
返回的后果是一个可读流的实例, 是非流动模式 — 咱们最初要转为流动模式
先要定义一下咱们读流的变量,假如咱们有一个 1.txt 文件,咱们要读取 1.txt 外面的类容
咱们先设置最高水位线每次读取 1k
let rs=fs.createReadStream(‘./1.txt’,{highWaterMark:1})
咱们的 rs 外面有绑定了两个事件办法 data 和 end
- fs.createWriteStream
const fs = require('fs');
const path = require('path');
let readPath = path.join(__dirname, `./dist/my.txt`);
let copyPath = path.join(__dirname, './dist/my.txt');
// 实现每次读取文件实时写入 将新的 buffer 存入数组 而后转成 buffer
save(`--:第 2 次退出:--`);
async function save(value) {
// 读取文件
const localBufArr = await readFileStream(readPath);
let totalLength = 0;
// 增加新进入的 buffer
localBufArr.push(new Buffer(value,['utf8']));
localBufArr.map(v => {totalLength += v.length})
// buffer 合并
let buf = Buffer.concat(localBufArr, totalLength); // buffer 合并 将数组 buffer 转成整个 buffer
console.log('buf',buf);
// 创立可写流
let firstCreate = fs.createWriteStream(copyPath);
// 写入 buffer
firstCreate.write(buf);
}
// 读文件 用流
function readFileStream(spath) {return new Promise((resolve, reject) => {
// 判断文件是否存在
if (fs.existsSync(spath)) {let readStream = fs.createReadStream(spath);
let arr = [];
let startTime = Date.now();
// 在外部一直触发 rs.emit('data', 数据);data 不能更改, 留动模式开启后,数据会疯狂触发 data 事件
readStream.on('data', function (chunk) { //chunk 是 buffer 类型
arr.push(chunk)
})
// 监听文件读取结束,会主动触发一次 end 事件,没有读取完是不会触发的
readStream.on('end', function (chunk) {let useTime = Date.now() - startTime;
console.log("读文件用" + (useTime/1000) +"s")
resolve(arr)
})
// 监听谬误
readStream.on('error', function (err) {console.log(err);
})
} else {reject("没有改文件")
}
})
}