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

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


相关推荐
陈振wx:zchen20089 小时前
JavaScript
javascript·js
天下代码客10 小时前
使用electronc框架调用dll动态链接库流程和避坑
前端·javascript·vue.js·electron·node.js
weixin1997010801611 小时前
【性能提升300%】仿1688首页的Webpack优化全记录
前端·webpack·node.js
不倒翁玩偶13 小时前
npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
前端·npm·node.js
一心赚狗粮的宇叔14 小时前
03.Node.js依赖包补充说明及React&Node.Js项目
前端·react.js·node.js
-嘟囔着拯救世界-15 小时前
【2026 最新版】OpenAI 祭出王炸 GPT-5.3-Codex!Win11 + VSCode 部署保姆级教程
vscode·gpt·chatgpt·node.js·node·codex·gpt5
全栈前端老曹1 天前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
行者无疆_ty1 天前
什么是Node.js,跟OpenCode/OpenClaw有什么关系?
人工智能·node.js·openclaw
-凌凌漆-1 天前
【npm】npm的-D选项介绍
前端·npm·node.js
lucky67071 天前
Windows 上彻底卸载 Node.js
windows·node.js