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

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


相关推荐
瓜瓜怪兽亚1 小时前
前端基础知识---10 Node.js(三)
数据结构·数据库·node.js
Q_Q5110082859 小时前
python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
spring boot·python·django·flask·uni-app·node.js·php
该用户已不存在13 小时前
PHP、Python、Node.js,谁能称霸2025?
python·node.js·php
Q_Q51100828517 小时前
python+nodejs+springboot在线车辆租赁信息管理信息可视化系统
spring boot·python·信息可视化·django·flask·node.js·php
濮水大叔19 小时前
VonaJS多租户🔥居然可以同时支持共享模式和独立模式,太牛了🚀
typescript·node.js·nestjs
前端伪大叔1 天前
第12篇|🔌 Freqtrade 交易所接入全解:API、WebSocket、限频配置详解
python·node.js
一粒马豆1 天前
excel表格通过前端fetch上传至后端flask处理流程示例
前端·python·flask·excel·h5·js·fetch
Q_Q5110082851 天前
python+django/flask哈利波特书影音互动科普网站
spring boot·python·django·flask·node.js·php
Q_Q19632884751 天前
python+springboot+uniapp基于微信小程序的巴马旅居养老系统 旅游养老小程序
spring boot·python·小程序·django·flask·uni-app·node.js
小白64021 天前
前端梳理体系从常问问题去完善-工程篇(webpack,vite)
前端·webpack·node.js