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(转换流)

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


相关推荐
只睡四小时9 小时前
MCP 弃用 SSE?Node 分帧漏 81.7% 事件
node.js·webassembly·实时通信·mcp·streamable http
hey you~20 小时前
个体户门店办理400电话,如何对接订单系统实现来电弹窗
node.js·webhook·400电话·门店数字化·来电弹窗·订单系统对接
YIAN2 天前
RAG 学到最后,我真正学会的不是“检索”,而是让系统知道自己缺什么
langchain·node.js·llm
用户11977079480732 天前
GitHub 电商开源项目分享:用 sharp 批量出饰品主图,试了裁剪、细节图和色彩配置文件三个坑
前端·node.js
donecoding2 天前
pnpm 配好了,为什么执行的还是另一份?命令入口与运行时排查
node.js·前端工程化
江屿风2 天前
【Plain Language Large Model】【从浏览器到全栈:一课精通Node.js三剑客】流食般投喂
笔记·前端框架·npm·node.js·js·npx
SomeOtherTime2 天前
node.js基础(AI回答)
node.js
雨季mo浅忆3 天前
记录Node.js安全漏洞及其内置Brotli解码器问题
node.js·安全性测试
tommyjiatong3 天前
资安底座连环雷:从 PHP2Shell 到 Node2Shell
node.js·php
SEO_juper3 天前
Bash 交叉验证 robots.txt 和 sitemap:两个文件自相矛盾,页面永远收录不了
开发语言·python·node.js·json·bash