Node.js 的流(Stream)是什么?有哪些类型?
目录
一、什么是 Stream(流)?
举个例子:读取文件
二、Node.js 中的流的类型
1. Readable Stream(可读流)
2. Writable Stream(可写流)
3. Duplex Stream(双工流)
4. Transform Stream(转换流)
三、Stream 的应用场景
四、总结
在使用 Node.js 开发时,我们经常会处理到 大文件读写、网络请求、文件上传下载 等场景。
如果一次性把文件或数据全部加载到内存里,效率低、内存消耗大,很容易造成性能问题。
这时,Stream(流) 就派上用场了。
一、什么是 Stream(流)?
流(Stream) 是 Node.js 中处理数据的一种抽象接口,它可以把数据分成一小块一小块进行处理,而不是一次性加载到内存。
简单来说:
-
不用等所有数据准备好再处理,而是边读取边处理
-
内存占用更小,效率更高
举个例子:读取文件
普通方式(一次性读取):
const fs = require('fs')fs.readFile('./bigfile.txt', (err, data) => {if (err) throw errconsole.log('文件内容:', data.toString())
})
这种方式会 一次性把整个文件读到内存中,如果文件很大(比如几个 G),很可能导致内存不足。
而用 流(stream) 的方式:
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()
const fs = require('fs')
const readStream = fs.createReadStream('input.txt')readStream.on('data', (chunk) => {console.log('读取数据:', chunk.toString())
})
2. Writable Stream(可写流)
-
数据的目的地,比如写入文件、网络响应输出等。
-
常见例子:
fs.createWriteStream()
const fs = require('fs')
const writeStream = fs.createWriteStream('output.txt')writeStream.write('Hello Stream!\n')
writeStream.end('写入结束')
3. Duplex Stream(双工流)
-
既可读又可写。
-
常见场景:网络 socket
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(转换流)
-
一种特殊的双工流,可以在读取和写入之间 对数据进行修改或转换。
-
常见场景:压缩、加密、数据格式转换。
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 的应用场景
-
文件读写(大文件处理,避免内存溢出)
-
网络通信(HTTP 请求和响应)
-
视频/音频处理(边传输边播放)
-
数据压缩/加密(
zlib
模块等)
四、总结
-
Stream 是 Node.js 处理大数据的利器,它通过分块传输,避免了一次性加载到内存的问题。
-
常见的 4 种流:
-
Readable(可读流)
-
Writable(可写流)
-
Duplex(双工流)
-
Transform(转换流)
-
-
在文件操作、网络通信、数据处理等场景中非常常用。