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

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


相关推荐
Juchecar15 小时前
解决Windows下根目录运行 pnpm dev “无法启动 Vite 前端,只能启动 Express 后端”
前端·后端·node.js
华仔啊18 小时前
NestJS 3 分钟搭好 MySQL + MongoDB,CRUD 复制粘贴直接运行
javascript·node.js
Bdygsl1 天前
Node.js(3)—— fs模块
node.js
丁同亚的博客1 天前
echarts大屏项目指南
echarts·可视化·js·web前端·大屏
召摇2 天前
负载均衡技术解析
java·node.js
关山月3 天前
在 Next.js 项目中使用 SQLite
node.js
赵民勇3 天前
npm使用的环境变量及其用法
前端·npm·node.js
币圈小菜鸟3 天前
Windows 环境下搭建移动端自动化测试环境(JDK + SDK + Node.js + Appium)
java·windows·python·测试工具·node.js·appium