nodejs有哪些常用 Stream流?分别什么时候使用?
2025-09-01 14:35
nodejs
7
0
0
0
标题录入
封面图
在 Node.js 中,**Stream(流)** 是一种处理大量数据的高效方式。它允许你逐步读取或写入数据,而不是一次性将整个数据加载到内存中。Node.js 提供了多种内置的 Stream 类型,适用于不同的使用场景。 --- ## 一、Node.js 常用的 Stream 流类型 ### 1. **Readable(可读流)** - **用途**:用于从源读取数据。 - **常见场景**: - 读取文件(如 `fs.createReadStream()`) - 接收 HTTP 请求体 - 从数据库查询结果中逐行读取 - **方法**: - `read()` - `on('data', callback)` - `on('end', callback)` - `on('error', callback)` > ✅ 示例: ```js const fs = require('fs'); const readableStream = fs.createReadStream('input.txt'); readableStream.on('data', (chunk) => { console.log('Received:', chunk.toString()); }); ``` --- ### 2. **Writable(可写流)** - **用途**:用于向目标写入数据。 - **常见场景**: - 写入文件(如 `fs.createWriteStream()`) - 发送 HTTP 响应体 - 向数据库插入数据 - **方法**: - `write()` - `end()` - `on('finish', callback)` - `on('error', callback)` > ✅ 示例: ```js const fs = require('fs'); const writableStream = fs.createWriteStream('output.txt'); writableStream.write('Hello, '); writableStream.write('World!'); writableStream.end(); ``` --- ### 3. **Duplex(双工流)** - **用途**:同时支持读和写的流。 - **常见场景**: - TCP socket(既接收也发送数据) - 自定义的双向通信协议 - **特点**: - 可以像 `Readable` 和 `Writable` 一样使用。 > ✅ 示例: ```js const net = require('net'); const server = net.createServer((socket) => { socket.on('data', (data) => { console.log('Received:', data.toString()); socket.write('Echo: ' + data); }); }); ``` --- ### 4. **Transform(转换流)** - **用途**:在读取和写入时对数据进行转换。 - **常见场景**: - 数据压缩/解压(如 `zlib` 模块) - 文本编码转换(如 `iconv`) - 数据格式转换(如 CSV 转 JSON) - **特点**: - 继承自 `Duplex`,可以覆盖 `_transform()` 方法。 > ✅ 示例: ```js const { Transform } = require('stream'); class UppercaseTransform extends Transform { _transform(chunk, encoding, callback) { this.push(chunk.toString().toUpperCase()); callback(); } } const transformStream = new UppercaseTransform(); transformStream.on('data', (data) => { console.log('Uppercase:', data.toString()); }); transformStream.write('hello'); transformStream.end(); ``` --- ## 二、常用的内置流模块 | 模块 | 流类型 | 用途 | |------|--------|------| | `fs` | Readable / Writable | 文件系统操作 | | `http` | Duplex | HTTP 请求/响应流 | | `zlib` | Transform | 数据压缩/解压 | | `crypto` | Transform | 加密/解密 | | `stream` | 所有类型 | 自定义流 | --- ## 三、什么时候使用 Stream? | 场景 | 使用哪种流 | |------|-------------| | 处理大文件(如 GB 级别) | `Readable` / `Writable` | | 实时数据传输(如视频流) | `Duplex` 或 `Transform` | | 需要转换数据格式 | `Transform` | | 处理网络请求体/响应体 | `Duplex`(如 HTTP) | | 自定义数据处理逻辑 | 自定义 `Transform` 流 | --- ## 四、总结 | 流类型 | 是否可读 | 是否可写 | 是否可转换 | 典型使用场景 | |--------|----------|----------|--------------|----------------| | Readable | ✅ | ❌ | ❌ | 读取数据 | | Writable | ❌ | ✅ | ❌ | 写入数据 | | Duplex | ✅ | ✅ | ❌ | 双向通信 | | Transform | ✅ | ✅ | ✅ | 数据转换 | --- 如果你有具体的应用场景(比如处理大文件、HTTP 流、加密等),我可以帮你推荐更具体的流使用方式 😊
上一篇:
如何捕获 EventEmitter的错误事件?
标题录入,一次不能超过6条
炒股技巧
T:0.010314s,M:124.91 KB
返回顶部
留言
留言
评论