Node.js 的流(Stream)是什么?有哪些类型?

目录

[一、什么是 Stream(流)?](#一、什么是 Stream(流)?)

举个例子:读取文件

[二、Node.js 中的流的类型](#二、Node.js 中的流的类型)

[1. Readable Stream(可读流)](#1. Readable Stream(可读流))

[2. Writable Stream(可写流)](#2. Writable Stream(可写流))

[3. Duplex Stream(双工流)](#3. Duplex Stream(双工流))

[4. Transform Stream(转换流)](#4. Transform Stream(转换流))

[三、Stream 的应用场景](#三、Stream 的应用场景)

四、总结


在使用 Node.js 开发时,我们经常会处理到 大文件读写、网络请求、文件上传下载 等场景。

如果一次性把文件或数据全部加载到内存里,效率低、内存消耗大,很容易造成性能问题。

这时,Stream(流) 就派上用场了。


一、什么是 Stream(流)?

流(Stream)Node.js 中处理数据的一种抽象接口,它可以把数据分成一小块一小块进行处理,而不是一次性加载到内存。

简单来说:

  • 不用等所有数据准备好再处理,而是边读取边处理

  • 内存占用更小,效率更高

举个例子:读取文件

普通方式(一次性读取):

javascript 复制代码
const fs = require('fs')

fs.readFile('./bigfile.txt', (err, data) => {
  if (err) throw err
  console.log('文件内容:', data.toString())
})

这种方式会 一次性把整个文件读到内存中,如果文件很大(比如几个 G),很可能导致内存不足。

而用 流(stream) 的方式:

javascript 复制代码
const fs = require('fs')

const readStream = fs.createReadStream('./bigfile.txt')

readStream.on('data', (chunk) => {
  console.log('读取到一块数据:', chunk.toString())
})

readStream.on('end', () => {
  console.log('文件读取完毕')
})

这种方式会 分块读取文件,每次只读一部分,大大减少内存占用。


二、Node.js 中的流的类型

在 Node.js 中,主要有 4 种类型的流

1. Readable Stream(可读流)

  • 数据源头,比如读取文件、网络请求输入等。

  • 常见例子:fs.createReadStream()

javascript 复制代码
const fs = require('fs')
const readStream = fs.createReadStream('input.txt')

readStream.on('data', (chunk) => {
  console.log('读取数据:', chunk.toString())
})

2. Writable Stream(可写流)

  • 数据的目的地,比如写入文件、网络响应输出等。

  • 常见例子:fs.createWriteStream()

javascript 复制代码
const fs = require('fs')
const writeStream = fs.createWriteStream('output.txt')

writeStream.write('Hello Stream!\n')
writeStream.end('写入结束')

3. Duplex Stream(双工流)

  • 既可读又可写。

  • 常见场景:网络 socket

javascript 复制代码
const { Duplex } = require('stream')

const myDuplex = new Duplex({
  read(size) {
    this.push('数据来自 read 方法\n')
    this.push(null) // 表示结束
  },
  write(chunk, encoding, callback) {
    console.log('写入内容:', chunk.toString())
    callback()
  }
})

myDuplex.on('data', (chunk) => {
  console.log('可读数据:', chunk.toString())
})

myDuplex.write('写入一些内容')

4. Transform Stream(转换流)

  • 一种特殊的双工流,可以在读取和写入之间 对数据进行修改或转换

  • 常见场景:压缩、加密、数据格式转换。

javascript 复制代码
const { Transform } = require('stream')

const upperCaseTransform = new Transform({
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase())
    callback()
  }
})

process.stdin.pipe(upperCaseTransform).pipe(process.stdout)

在终端输入 hello,输出会变成 HELLO


三、Stream 的应用场景

  1. 文件读写(大文件处理,避免内存溢出)

  2. 网络通信(HTTP 请求和响应)

  3. 视频/音频处理(边传输边播放)

  4. 数据压缩/加密zlib 模块等)


四、总结

  • Stream 是 Node.js 处理大数据的利器,它通过分块传输,避免了一次性加载到内存的问题。

  • 常见的 4 种流:

    • Readable(可读流)

    • Writable(可写流)

    • Duplex(双工流)

    • Transform(转换流)

  • 在文件操作、网络通信、数据处理等场景中非常常用。


相关推荐
朝朝暮暮an6 小时前
Day 2|Node.js 运行机制、模块系统与异步初探
node.js
aidou131413 小时前
Visual Studio Code(VS Code)安装步骤
vscode·npm·node.js·环境变量
止观止15 小时前
告别 require!TypeScript 5.9 与 Node.js 20+ 的 ESM 互操作指南
javascript·typescript·node.js
一只专注api接口开发的技术猿15 小时前
淘宝商品详情API的流量控制与熔断机制:保障系统稳定性的后端设计
大数据·数据结构·数据库·架构·node.js
天远数科19 小时前
天远车辆过户查询API集成指南:Node.js 全栈视角下的二手车数据挖掘
大数据·数据挖掘·node.js·vim
esmap20 小时前
Clawdbot与ESMAP数字孪生技术融合分析
人工智能·计算机视觉·3d·ai·js
全栈小520 小时前
【前端】win11操作系统安装完最新版本的NodeJs运行npm install报错,提示在此系统上禁止运行脚本
前端·npm·node.js
莫有杯子的龙潭峡谷1 天前
在 Windows 系统上安装 OpenClaw
人工智能·node.js·安装教程·openclaw
共享家95272 天前
基于 Coze 工作流搭建历史主题图片生成器
前端·人工智能·js
朝朝暮暮an2 天前
Node.js-第一天学习内容
node.js