Node.js Stream 学习笔记

什么是Stream

Stream 是 Node.js 中处理流式数据的抽象接口,Stream 的核心在于将数据分成各个小块,逐个处理这些小块,避免一次性加载大量数据造成内存占用过高的问题。

Node.js 的 Stream 接口分为四种基本类型:可读流(Readable)、可写流(Writable)、可读可写流(Duplex)、转换流(Transform)。

可读流(Readable)

可读流对象就是读取数据的源头,常见的有文件可读流、HTTP 响应可读流等。

可读流的常用属性和方法:

  • readable.read([size]):从可读流读取指定大小的数据,默认为读取全部数据。
  • readable.pipe(destination[, options]):将可读流中的数据通过管道传输到可写流中。
  • readable.pause()readable.resume():暂停和恢复读取数据。

Demo:

javascriptCopy Code
const fs = require('fs'); const readableStream = fs.createReadStream('./example.txt', { encoding: 'utf8' }); readableStream.on('data', (chunk) => { console.log(chunk); }); readableStream.on('end', () => { console.log('读取结束'); });

可写流(Writable)

可写流对象就是写入数据的目标,常见的有文件可写流、HTTP 请求可写流等。

可写流的常用属性和方法:

  • writable.write(chunk[, encoding][, callback]):将数据写入到可写流中。
  • writable.end([chunk[, encoding]][, callback]):写入完成后结束可写流。
  • writable.destroy()writable.destroySoon():销毁可写流。

Demo:

javascriptCopy Code
const fs = require('fs'); const writableStream = fs.createWriteStream('./example.txt', { encoding: 'utf8' }); writableStream.write('Hello '); writableStream.write('World!'); writableStream.end();

可读可写流(Duplex)

可读可写流对象既可以读数据也可以写数据,常见的有 TCP 套接字、Gzip 压缩流等。

可读可写流继承了可读流和可写流的所有属性和方法。

转换流(Transform)

转换流对象是一种特殊的 Duplex 流对象,它可以对数据进行转换处理,常见的有 Gzip 压缩流、加密流等。

转换流继承了 Duplex 流的所有属性和方法,并添加了额外的 _transform()_flush() 方法来实现数据的转换。

Stream 的使用场景

Stream 是 Node.js 中非常重要的模块,它在许多场景中都得到了广泛应用,比如:

  • 在 HTTP 服务中,利用 Stream 可以异步地将 HTML 文件一行一行发送给客户端。
  • 在前端开发中,可以使用 Stream 处理大型图片或视频文件。
  • 在爬虫开发中,利用 Stream 可以大幅度减少内存使用量,提高性能。
  • 在日志处理中,可以使用 Stream 逐行读取日志文件并进行分析。

参考资料