可读流案例

// 文件可读流创立和生产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)