Node.js 流 Stream【详解】

简介: Node.js 流 Stream【详解】

什么是流?

流是一种将整体数据分割成多个小块依次进行处理的方式。

举个形象的例子:

山上有1000颗拳头大的小石子,需要搬下山。

  • 传统的处理方式:安排一辆大卡车,一次性将石子全部运下山。
  • 流的处理方式:修建一条管道,将小石子一颗颗的丢进管道,自己滚下山。

流的类型

共四种:

  • Readable -可读流【数据源】-- 可读
  • Writable -可写流-- 可写
  • Duplex -双向流-- 可读+可写
  • Transform -转换流【数据加工厂】-- 操作被写入数据,然后读出结果。

流的事件和方法

常用事件有:

  • 可读流读取数据时触发 data 事件
// chunk 为数据片段
readableSrc.on("data", (chunk) => {});
  • 可读流读取数据完成时触发 end 事件
// chunk 为数据片段
readableSrc.on("end", (chunk) => {});
  • 可写流写完数据时触发 finish 事件

可读流的常用方法有:

  • 用管道传输 pipe()
  • 关闭管道传输 unpipe()
  • 读取数据 read ()
  • 将数据推回内部缓冲区 unshift()
  • 继续读取数据 resume()
  • 暂停传输 pause()
  • 判断是否暂停传输 isPaused()
  • 指定编码类型 setEncoding()

可写流的常用方法有:

  • 写入 write()
  • 结束写入 end()
  • 将数据写入内存 cork()
  • 取消写入内存 uncork()
  • 指定默认编码类型 setDefaultEncoding()

Node.js 内支持流的内置模块

流的使用

读取文件输出到控制台

import { createReadStream } from "fs";

// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 将可读流的内容输出到控制台
readableSrc.pipe(process.stdout);

读取文件并输出到新文件

import { createReadStream, createWriteStream } from "fs";

// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 创建可写流
const writeSrc = createWriteStream("./test2.txt");
// 将可读流的内容通过管道传输到可写流中
readableSrc.pipe(writeSrc);
// 若不存在test2.txt,则会创建test2.txt,内容与test.txt相同
// 若已存在test2.txt,则会清空test2.txt的原内容,并将test.txt的内容写入其中,最终test2.txt的内容与test.txt相同

最后的 pipe 相当于

// chunk 为数据片段
readableSrc.on("data", (chunk) => {
  writeSrc.write(chunk);
});

readableSrc.on("end", () => {
  writeSrc.end();
});

读取文件并压缩打包

import { createReadStream, createWriteStream } from "fs";
// 导入方法--创建.gz的压缩包
import { createGzip } from "zlib";
// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 创建可写流
const writeSrc = createWriteStream("./test.gz");
// 先将可读流的内容通过管道传输到转换流进行压缩打包
// 再将转换流中的压缩包数据通过管道传输到可写流中
readableSrc.pipe(createGzip()).pipe(writeSrc);

此处的 createGzip() 是一个转换流


目录
相关文章
|
7月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
256 0
|
7月前
|
JavaScript 前端开发 API
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
97 0
|
2月前
|
JavaScript
Node.js Stream(流)
10月更文挑战第4天
29 1
Node.js Stream(流)
|
7月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(上)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
188 0
|
6月前
|
JavaScript
Node.js Stream(流)
Node.js Stream(流)
31 0
|
7月前
|
JavaScript 算法 网络协议
【Node系列】node中的流(Stream)
Node.js 中的流(Stream)是一种处理数据的方式,它允许你以流的方式处理数据,而不是一次性加载整个数据集。这种方式对于处理大量数据非常有用,因为它可以减少内存的使用并提高性能。
72 4
|
7月前
|
JavaScript 网络协议 数据处理
Node.js中的Buffer与Stream:深入解析与使用
【4月更文挑战第30天】本文深入解析了Node.js中的Buffer和Stream。Buffer是处理原始数据的全局对象,适用于TCP流和文件I/O,其大小在V8堆外分配。创建Buffer可通过`alloc`和`from`方法,它提供了读写、切片和转换等操作。Stream是处理流式数据的抽象接口,分为可读、可写、双工和转换四种类型,常用于处理大量数据而无需一次性加载到内存。通过监听事件和调用方法,如读取文件的可读流示例,可以实现高效的数据处理。理解和掌握Buffer及Stream能提升Node.js应用的性能。
|
7月前
|
JavaScript 大数据 数据处理
什么是Node.js的流(stream)?它们有什么作用?
什么是Node.js的流(stream)?它们有什么作用?
96 3
|
7月前
|
存储 JavaScript 网络协议
什么是Node.js Stream(流)?
什么是Node.js Stream(流)?
90 0
|
存储 运维 JavaScript
【Node.js实战】一文带你开发博客项目之日志(文件读写、stream流、写日志)
【Node.js实战】一文带你开发博客项目之日志(文件读写、stream流、写日志)
264 3