Node.stream流

24 阅读1分钟

node中对于流文件的读取,定义 为什么

  1. 通过node 读取文件的是时候,分为两种方式,一种直接通过fs来读取,就是一次性将文件读取到内存里面,另一种就是通过流式读取,就是分治,把大文件,分为多段读取,对内存消耗,较低。

应用 流的主要场景在于,大文件处理的时候,如果等所有文件都处理完毕再去响应,太慢,因此采取流式传输会更快一些,但是怎么知道传输完毕了,通过0块,以及对应contentLength来确定

分类 在node中,所有流一共就4种,分别为可读流,可写流,全双工流,转换流

import stream from 'node:stream';

// 可读流
const Readable = stream.Readable;
// 可写流
const Writable = stream.Writable;
// 双工流
const Duplex = stream.Duplex;
// 转换流
const Transform = stream.Transform;




  

具体原理

  1. 可读流,其实就是_read方法的具体实现
import { Readable } from 'node:stream';

const readableStream = new Readable();

readableStream._read = function () {
  this.push('阿门阿前一棵葡萄树,');
  this.push('阿东阿东绿的刚发芽,');
  this.push('阿东背着那重重的的壳呀,');
  this.push('一步一步地往上爬。')
  this.push(null);
}

readableStream.on('data', (data) => {
  console.log(data.toString())
});

readableStream.on('end', () => {
  console.log('done');
});

  1. 可写流,其实是_write的具体实现
import { Writable } from 'node:stream';

class WritableDong extends Writable {

  constructor(iterator) {
    super();
    this.iterator = iterator;
  }

  _write(data, enc, next) {
    console.log(data.toString());
    setTimeout(() => {
      next();
    }, 1000);
  }
}

function createWriteStream() {
  return new WritableDong();
}

const writeStream = createWriteStream();

writeStream.on('finish', () => console.log('done'));

writeStream.write('阿门阿前一棵葡萄树,');
writeStream.write('阿东阿东绿的刚发芽,');
writeStream.write('阿东背着那重重的的壳呀,');
writeStream.write('一步一步地往上爬。');
writeStream.end();

具体的使用

  1. fs.createReadStream 是可读流 readAble的具体实现
  2. fs.wtrteStream 是可写流writeable的具体实现
  3. duplex 双工流,socket是具体实现
  4. transform 是基于双工流进行内容转换,createGzip压缩(压缩势必涉及文件内容转换,压缩)具体实现