可读流案例
// 文件可读流创立和生产const fs = require("fs");let rs = fs.createReadStream("test.txt", { flags: "r", encoding: null, fd: null, mode: 438, autoClose: true, start: 0, // end:3, highWaterMark: 4,});// rs.on('data',(chunk)=>{// console.log(chunk.toString())// rs.pause() // 暂停// setTimeout(() => {// rs.resume() // 切回流动状态// }, 1000); // 1秒后持续,直到完结// })// rs.on("readable", () => {// // let data = rs.read();// // console.log(data);// let data;// // while ((data = rs.read()) !== null) {// // console.log(data.toString());// // }// while ((data = rs.read(2)) !== null) { // 每次读两字节,缓冲区读完之后取highWaterMark字节长度到缓冲区// console.log(data.toString());// console.log(rs._readableState.length);// }// });rs.on("open", (fd) => { console.log(fd, "file open");});rs.on("close", (fd) => { console.log("默认不会被执行,数据被读取完(生产)后才会被执行");});rs.on("data", (chunk) => { console.log(chunk);});rs.on("end", () => { console.log('数据被清空过之后会被执行');});rs.on("err", (err) => { console.log('出错时会被执行');});
可写流
案例
const ws = fs.createWriteStream("test.txt", { flags: "w", mode: 438, fd: null, encoding: "utf-8", start: 0, highWaterMark: 3,});// ws.write("写入内容", () => {// console.log("write over1");// });// ws.write("能够屡次写入,前面的默认会被追加", () => {// console.log("write over2");// });// ws.write(1, () => { // 会报错,这里默认接管字符串或者buffer => fs rs// console.log("write over1");// });ws.on("open", (fd) => { console.log("open", fd);});ws.on("close", () => { // 数据写入操作全副实现后再执行,end之后 console.log("file close");});// end执行之后就意味着数据写入操作实现ws.end(); // end中也能够放入要写的内容,最初最终执行写入ws.on("err", (err) => { console.log("err");});
可写流写入速度问题
let ws = fs.createWriteStream("test.txt", { highWaterMark: 3,});let flag = ws.write("1");console.log(flag); // trueflag = ws.write("2");console.log(flag);// trueflag = ws.write("3");console.log(flag); // false ,// 1,第一次调用write办法时是将数据间接写入到文件中// 2,第二次开始write办法就是将数据写入至缓存区// 3,生产速度和生产数据不一样,个别状况下生产速度要比生产速度快很多// 4,当flag为false之后,false不代表以后数据不能被执行写入,然而咱们应该告知数据生产者,以后生产速度曾经跟不上生产速度,这时候咱们会将// 可读流的模块批改为暂停模式// 5,当数据生产者暂停之后,消费者会缓缓消化它外部缓存中的数据,直到咱们可再次被执行写入操作// 6,当缓冲区能够持续写入数据时通过drain工夫让生产者直到ws.on("drain", () => { console.log("drain work");});
管制写入速度,被压机制
分批限流
let ws = fs.createWriteStream("test.txt", { highWaterMark: 3,});// ws.write('前端性能')let source = "前端性能".split("");let num = 0;let flag = true;function excuteWrite() { flag = true; while (num !== 4 && flag) { flag = ws.write(source[num]); num++; }}excuteWrite();ws.on("drain", () => { console.log("drain work"); excuteWrite();});
或者这里间接应用rs.pipe(ws)