Node.js入门教程(十八):Stream(流)
一、什么是 StreamNode.js 的 Stream 是一种处理流式数据的抽象接口广泛应用于文件操作、网络通信等场景。流式数据处理的一个主要优点是可以在数据传输过程中就开始处理数据而不需要等待整个数据加载完毕这使得 Node.js 能够高效地处理大量数据而不会占用过多的内存。Stream 是一个抽象接口Node 中有很多对象实现了这个接口。例如对 http 服务器发起请求的request对象就是一个 Stream还有stdout标准输出。Node.js 的 Stream流允许你以流的形式处理数据而不是一次性将数据全部加载到内存中。这对于处理大量数据或者实现高效的数据传输非常有用。二、流的四种类型类型说明Readable可读流可读操作如文件读取流、网络请求响应流Writable可写流可写操作如文件写入流、网络请求发送流Duplex双工流可读可写操作如 TCP 套接字Transform转换流操作被写入数据然后读出结果如压缩/解压缩流常用事件所有的 Stream 对象都是EventEmitter的实例。常用的事件有事件说明data当有数据可读时触发end没有更多的数据可读时触发error在接收和写入过程中发生错误时触发finish所有数据已被写入到底层系统时触发三、从流中读取数据常见的可读流包括文件读取流和网络请求响应流。创建input.txt文件内容如下地址www.chenbyte.com创建main.js文件代码如下var fs require(fs); var data ; // 创建可读流 var readerStream fs.createReadStream(input.txt); // 设置编码为 utf8 readerStream.setEncoding(UTF8); // 处理流事件 -- data, end, and error readerStream.on(data, function(chunk) { data chunk; }); readerStream.on(end, function() { console.log(data); }); readerStream.on(error, function(err) { console.log(err.stack); }); console.log(程序执行完毕);以上代码执行结果如下程序执行完毕 地址www.chenbyte.com四、写入流可写流用于将数据写入目的地常见的可写流包括文件写入流和网络请求发送流。创建main.js文件代码如下var fs require(fs); var data 菜鸟教程官网地址www.runoob.com; // 创建一个可以写入的流写入到文件 output.txt 中 var writerStream fs.createWriteStream(output.txt); // 使用 utf8 编码写入数据 writerStream.write(data, UTF8); // 标记文件末尾 writerStream.end(); // 处理流事件 -- finish、error writerStream.on(finish, function() { console.log(写入完成。); }); writerStream.on(error, function(err) { console.log(err.stack); }); console.log(程序执行完毕);以上程序会将data变量的数据写入到output.txt文件中。代码执行结果如下$ node main.js 程序执行完毕 写入完成。查看output.txt文件的内容$ cat output.txt 地址www.chenbyte.com五、双工流Duplex双工流同时具有可读和可写的能力。一个典型的双工流是 TCP 套接字。const net require(net); // 创建一个 TCP 服务器 const server net.createServer((socket) { console.log(Client connected.); // 读取客户端数据 socket.on(data, (data) { console.log(Received data:, data.toString()); }); // 向客户端发送数据 socket.write(Hello, Client!\n); // 监听关闭事件 socket.on(end, () { console.log(Client disconnected.); }); }); server.listen(3000, () { console.log(Server listening on port 3000.); });六、转换流Transform转换流是一种特殊的双工流可以修改或转换数据。常见的转换流包括压缩和解压缩流。const zlib require(zlib); const fs require(fs); // 创建一个可读流 const readableStream fs.createReadStream(example.txt); // 创建一个转换流压缩 const gzip zlib.createGzip(); // 创建一个可写流 const writableStream fs.createWriteStream(example.txt.gz); // 将可读流管道到转换流再管道到可写流 readableStream.pipe(gzip).pipe(writableStream); // 监听完成事件 writableStream.on(finish, () { console.log(File compressed successfully.); });七、管道流Pipe管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。把文件比作装水的桶而水就是文件里的内容我们用一根管子pipe连接两个桶使得水从一个桶流入另一个桶这样就慢慢实现了大文件的复制过程。管道流操作实例设置input.txt文件内容如下菜鸟教程官网地址www.chenbyte.com创建main.js文件代码如下var fs require(fs); // 创建一个可读流 var readerStream fs.createReadStream(input.txt); // 创建一个可写流 var writerStream fs.createWriteStream(output.txt); // 管道读写操作 // 读取 input.txt 文件内容并将内容写入到 output.txt 文件中 readerStream.pipe(writerStream); console.log(程序执行完毕);代码执行结果如下$ node main.js 程序执行完毕查看output.txt文件的内容$ cat output.txt 地址www.chenbyte.com八、链式流链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。接下来我们使用管道和链式来压缩和解压文件。压缩文件创建compress.js文件代码如下var fs require(fs); var zlib require(zlib); // 压缩 input.txt 文件为 input.txt.gz fs.createReadStream(input.txt) .pipe(zlib.createGzip()) .pipe(fs.createWriteStream(input.txt.gz)); console.log(文件压缩完成。);代码执行结果如下$ node compress.js 文件压缩完成。执行完以上操作后可以看到当前目录下生成了input.txt的压缩文件input.txt.gz。解压文件创建decompress.js文件代码如下var fs require(fs); var zlib require(zlib); // 解压 input.txt.gz 文件为 input.txt fs.createReadStream(input.txt.gz) .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream(input.txt)); console.log(文件解压完成。);代码执行结果如下$ node decompress.js 文件解压完成。九、暂停和恢复可读流可以暂停和恢复数据的读取。const fs require(fs); const readableStream fs.createReadStream(example.txt, utf8); readableStream.on(data, (chunk) { console.log(Received chunk:, chunk); readableStream.pause(); // 暂停读取 setTimeout(() { readableStream.resume(); // 恢复读取 }, 1000); });十、销毁流可以销毁流释放资源。const fs require(fs); const readableStream fs.createReadStream(example.txt, utf8); readableStream.on(data, (chunk) { console.log(Received chunk:, chunk); readableStream.destroy(); // 销毁流 });十一、流的主要方法方法说明readable.pipe(destination)将可读流的数据传输到可写流readable.on(data, callback)监听数据事件readable.on(end, callback)监听结束事件readable.pause()暂停可读流readable.resume()恢复可读流readable.destroy()销毁可读流writable.write(chunk)写入数据到可写流writable.end()结束写入writable.on(finish, callback)监听写入完成事件writable.on(error, callback)监听错误事件十二、本章小结知识点说明Stream 是什么处理流式数据的抽象接口高效处理大量数据四种流类型Readable可读、Writable可写、Duplex双工、Transform转换常用事件data、end、error、finish管道流pipe()方法将可读流连接到可写流链式流多个pipe()串联形成处理链压缩/解压使用zlib模块配合转换流实现控制流pause()、resume()、destroy()控制流的行为提示Stream 是 Node.js 高效处理 I/O 的核心机制。对于大文件处理、网络数据传输等场景使用 Stream 可以显著降低内存占用提升应用性能。管道流pipe是 Stream 中最常用的操作模式可以简洁地将数据从源头传递到目的地。

相关新闻

QGIS布局模板实战:提升GIS地图出图效率300%

QGIS布局模板实战:提升GIS地图出图效率300%

1. QGIS布局模板核心价值解析在地理信息系统(GIS)工作中,地图出图是成果展示的关键环节。QGIS的布局模板功能相当于设计师的样式库,能让我们快速复用成熟的版式设计。预设模板是软件自带的"标准答案",而自定…

2026/8/13 7:18:17 阅读更多 →
终极指南:免费将图片转换为3D打印模型的ImageToSTL工具

终极指南:免费将图片转换为3D打印模型的ImageToSTL工具

终极指南:免费将图片转换为3D打印模型的ImageToSTL工具 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side.…

2026/8/13 7:18:17 阅读更多 →
广度优先搜索(BFS)算法详解:从核心思想到迷宫最短路径实战

广度优先搜索(BFS)算法详解:从核心思想到迷宫最短路径实战

1. 从“地毯式搜索”到“层层递进”:广搜(BFS)的核心思想如果你玩过一些即时战略游戏,比如需要探索战争迷雾的地图,你会发现一个有趣的现象:你的视野是从基地开始,一圈一圈均匀地向四周扩散开来…

2026/8/13 7:18:17 阅读更多 →

最新新闻

从零构建AI编程助手:基于Python实现Claude Code核心原理

从零构建AI编程助手:基于Python实现Claude Code核心原理

1. 项目缘起:为什么我们需要一个“Claude Code”? 最近在AI编程圈子里,“Claude Code”这个词的热度居高不下。如果你在搜索引擎里输入它,会发现大量关于安装、配置、使用的讨论,甚至还有“超级小白入门指南”。但说实…

2026/8/13 8:00:37 阅读更多 →
Element UI/Plus el-dropdown事件机制全解析:从原理到实战避坑

Element UI/Plus el-dropdown事件机制全解析:从原理到实战避坑

1. 项目概述:Element UI/Plus 中的 el-dropdown 事件机制深度解析 在 Vue 生态的前端开发中,Element UI 及其升级版 Element Plus 是构建中后台管理系统的首选组件库之一。 el-dropdown 下拉菜单组件因其简洁的交互和灵活的配置,被广泛应用…

2026/8/13 8:00:37 阅读更多 →
如何快速清理Windows右键菜单:专业管理工具终极指南

如何快速清理Windows右键菜单:专业管理工具终极指南

如何快速清理Windows右键菜单:专业管理工具终极指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 您是否曾被Windows右键菜单的混乱所困扰&#xf…

2026/8/13 8:00:37 阅读更多 →
微信小程序健康管理平台开发实战与架构解析

微信小程序健康管理平台开发实战与架构解析

1. 项目概述:健康指导平台的微信小程序实现去年参与了一个健康管理类小程序的全流程开发,从需求分析到最终上线跑了整整三个月。这类项目最核心的价值在于打通了健康服务与移动端的最后一公里——让用户无需下载App,在微信里就能获得专业的健…

2026/8/13 8:00:37 阅读更多 →
OpenClaw Channel插件开发实战:解决高并发音频通信与统一HTTP认证

OpenClaw Channel插件开发实战:解决高并发音频通信与统一HTTP认证

1. 从一次失败的调用说起:为什么我们需要Channel插件那天下午,我正在调试一个基于OpenClaw构建的智能客服对话流。核心逻辑很简单:用户通过飞书发来一段语音,系统调用大模型理解意图,再调用一个外部天气API获取数据&am…

2026/8/13 8:00:37 阅读更多 →
视频转EXE工具:一键将MP4、AVI、MKV、MOV等格式打包为Windows可执行文件(兼容Win10/Win11)

视频转EXE工具:一键将MP4、AVI、MKV、MOV等格式打包为Windows可执行文件(兼容Win10/Win11)

温馨提示:文末有联系方式 工具核心功能简介 本视频转EXE软件专为内容分发与离线播放场景设计,可将常见视频文件快速封装为标准Windows可执行程序(.exe),生成的文件自带解码器与播放内核,无需额外安装播放器…

2026/8/13 7:59:36 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 1:11:09 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/12 1:11:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/11 17:09:45 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/12 1:11:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/11 17:09:45 阅读更多 →