Node.js_流Stream

Node.js 中的流(Streams)是一种处理读取和写入数据的抽象接口,它允许你以非阻塞的方式处理数据,这对于处理大文件或网络请求等 I/O 密集型任务非常有用。流主要分为四种类型:可读流(Readable)、可写流(Writable)、双工流(Duplex)和转换流(Transform)。

1. 可读流(Readable Streams)

可读流用于从源读取数据。数据源可以是文件、网络连接等。

常用函数:
  • read([size]):从流中读取数据。不推荐直接使用,因为流的设计初衷是自动处理数据的流动。
  • pipe(destination[, options]):将可读流的数据流重定向到一个可写流。这是处理流数据最常见的方法之一。
  • pause():暂停流中的数据读取。
  • resume():恢复流的数据读取。
  • on('data', callback):当流中有数据可读时,触发回调函数。
  • on('end', callback):当没有更多数据可读时触发。
  • on('error', callback):处理流中的错误。

2. 可写流(Writable Streams)

可写流用于将数据写入目标。目标可以是文件、网络连接等。

常用函数:
  • write(chunk[, encoding][, callback]):向流中写入数据。chunk 是要写入的数据,encoding 是数据的编码(如果 chunk 是字符串),callback 是写入完成后的回调函数。
  • end([chunk][, encoding][, callback]):结束写入过程。可选的 chunkencoding 允许在结束前再写入一些数据。
  • on('drain', callback):当可以继续写入数据时被调用(即流内部的缓冲区为空时)。
  • on('finish', callback):当所有数据都被写入底层系统时触发。
  • on('error', callback):处理流中的错误。

3. 双工流(Duplex Streams)

双工流既是可读流也是可写流。例如,TCP 套接字连接。

继承自可读流和可写流的属性和方法。

4. 转换流(Transform Streams)

转换流是特殊的双工流,其输出数据是基于输入数据的某种转换。例如,zlib.createGzip() 用于创建 gzip 压缩流。

常用函数(继承自双工流):
  • _transform(chunk, encoding, callback):这是转换流的核心方法,需要被重写以实现自定义的转换逻辑。chunk 是要转换的数据块,encoding 是数据的编码(如果 chunk 是字符串),callback 是转换完成后的回调函数。

    const fs = require('fs');
    const readableStream = fs.createReadStream('input.txt');
    const writableStream = fs.createWriteStream('output.txt');

    readableStream.pipe(writableStream);

    readableStream.on('end', () => {
    console.log('文件读取完毕');
    });

    writableStream.on('finish', () => {
    console.log('文件写入完毕');
    });

在这个例子中,我们使用 fs.createReadStream 创建一个可读流来读取 input.txt 文件,然后使用 fs.createWriteStream 创建一个可写流来写入 output.txt 文件。通过 pipe 方法,我们实现了从可读流到可写流的数据流重定向。当可读流结束(end 事件)时,表示文件已读取完毕;当可写流完成写入(finish 事件)时,表示数据已完全写入目标文件。

相关推荐
qqxhb9 分钟前
系统架构设计师备考第64天——网络构建关键技术
网络·系统架构·mtbf·mttr·冗余硬件·软件热备·快速检测
前端架构师-老李10 分钟前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心39 分钟前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武43 分钟前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女1 小时前
css 画一个圆角渐变色边框
前端·css
zy happy1 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年1 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长2 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen2 小时前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js
jingling5552 小时前
Flutter | 基础环境配置和创建flutter项目
前端·flutter