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/10/15 5:07: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/10/15 10:53:25 阅读更多 →
广度优先搜索(BFS)算法详解:从核心思想到迷宫最短路径实战

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

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

2026/10/8 11:24:39 阅读更多 →

最新新闻

C4D插件Octane 4.0 RC7上手指南:安装、调参与避坑

C4D插件Octane 4.0 RC7上手指南:安装、调参与避坑

简介:面向C4D用户的OctaneRender 4.0 RC7渲染器资源包,覆盖C4D R15至R20等主流版本,专为需要GPU加速、实时预览和照片级输出的设计师打造。压缩包共605个文件,内含184张png贴图、164个res资源文件、80个str字符串、78个h头文件与6…

2026/10/15 13:02:27 阅读更多 →
VS Code配置MATLAB:小白零基础到跑通全流程

VS Code配置MATLAB:小白零基础到跑通全流程

你是不是也经历过这种场景:只是想改一行 plot 的颜色,却得等 MATLAB 那个慢悠悠的启动界面转半天;想翻一翻别人几十个 .m 文件组成的项目,自带编辑器又让你在文件树和标签页之间来回折腾。于是大家自然都想到同一个问题——VS Cod…

2026/10/15 13:02:27 阅读更多 →
Flutter安全库sec的鸿蒙适配与性能优化实践

Flutter安全库sec的鸿蒙适配与性能优化实践

1. 项目背景与核心价值在跨平台开发领域,Flutter因其高效的渲染性能和跨端一致性备受开发者青睐。而sec作为Flutter生态中重要的安全加解密库,其鸿蒙化适配对于构建全场景安全应用具有关键意义。最近我在为某金融类应用做鸿蒙适配时,发现sec库…

2026/10/15 13:02:27 阅读更多 →
DFTtoolbox:MATLAB离散傅里叶变换工程化验证工具箱

DFTtoolbox:MATLAB离散傅里叶变换工程化验证工具箱

简介:本资源是一个面向凝聚态物理与计算材料科学领域的DFT计算辅助工具箱,专为使用Quantum ESPRESSO、ABINIT、ELK等主流第一性原理软件的研究者设计,显著降低DFT建模与后处理的学习门槛。工具箱以Python实现,核心理念是“用户输入…

2026/10/15 13:02:27 阅读更多 →
深入拆解VNode:从虚拟节点到真实DOM的渲染全流程

深入拆解VNode:从虚拟节点到真实DOM的渲染全流程

做前端这些年,如果要我选一个最值得拿出来单独拆开讲的底层概念,排第一的应该就是 VNode,也就是虚拟节点。我们平时写模板、写渲染函数,最后都是靠一套 VNode 结构和相应的处理逻辑,把"界面应该长什么样"翻译…

2026/10/15 13:02:27 阅读更多 →
Qt跨数据库获取SQL表字段元数据的工程实践

Qt跨数据库获取SQL表字段元数据的工程实践

1. 项目概述:为什么“获取SQL数据表所有字段”是Qt开发中绕不开的硬需求在用Qt做数据库应用开发时,我几乎每天都会遇到这个场景:界面刚打开,需要动态加载某张表的全部字段名来构建查询条件面板;或者用户点开一个数据编…

2026/10/15 13:01:26 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →