Node.js中流(stream)的使用方法示例

发布时间 - 2026-01-11 02:21:57    点击率:

前言

本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件和非阻塞I/O库,流模块允许在其可用的时候动态处理,在其不需要的时候释放掉.

使用流的好处

举一个读取文件的例子:

使用fs.readFileSync同步读取一个文件,程序会被阻塞,所有的数据都会被读取到内存中.

换用fs.readFile读取文件,程序不会被阻塞,但是所有的数据依旧会被一次性全部被读取到内存中.

当处理大文件压缩,归档,媒体文件和巨大的日志文件的时候,内存使用就成了问题,在这种情况下,流的优势就体现出来了.

流被设计为异步的方式.相比将剩余的文件数据一次性读进内存,还是值得读取一个缓冲区,期望的操作将会被执行,而且结果会被写到输出流.

流的分类

  • stream.Readable---用于在I/O上获取数据
  • stream.Writable---用于在输出的目标写入数据
  • stream.Duplex---一个可读可写的流,例如网络连接
  • stream.Transform---一个会以某种方式修改数据的双工流

创建一个可读流

方法一

var Stream = require('stream')
var readable = Stream.Readable();
var source = ['a', 'b', 'c'];
readable._read = function() {
 this.push(source.shift() || null);
}
readable.pipe(process.stdin);

方法二

var Readable = require('stream').Readable;

function MyStream(options) {
 Readable.call(this, options);
}

MyStream.prototype = Object.create(Readable.prototype, {
 constructor: { value: MyStream }
});

MyStream.prototype._read = function() {
 this.push("hello");
 this.push(null);
}

var streams = new MyStream();

streams.pipe(process.stdin);

方法三

var stream = require('stream');
var util = require('util');

function MyStream(options) {
 stream.Readable.call(this, options);
}

MyStream.prototype._read = function(size) {
 this.push('hello');
 this.push(null);
}

util.inherits(MyStream, stream.Readable);

var streams = new MyStream();

streams.pipe(process.stdout);

可读流的一些概念

可读流是 对提供数据的源头的抽象

可读流的实例

  • http responses,on the client
  • http requests, on the server
  • fs read stream
  • zlib streams
  • crypto streams
  • TCP sockets
  • child process stdout and stderr
  • process.stdin

可读流的模式

可读流有两种工作模式:flowing和paused.

在flowing模式下,可读流自动从系统底层读取数据,并通过EventEmitter接口的事件尽快将数据提供给应用.

可读流在创建的时候都是处在paused模式.

可读流可以在两种模式下切换.

处于paused模式可读流,可以通过下面三种途径切换到flowing模式:

  • 监听'data'事件.
  • 调用stream.resume()方法.
  • 调用stream.pipe()方法将数据发送到Writable

处于flowing模式可读流,可以通过下面两种途径切换到paused模式:

  • 如果不存在管道目标,可以通过调用stream.pause()方法实现
  • 如果存在管道目标,可以通过取消'data'事件监听,并调用stream.unpipe()方法移除所有管道来实现

可读流事件

可读流提供了以下事件:

  • 'close'事件,事件将在流或底层资源关闭后触发,但不是所有的流都会触发该事件.
  • 'data'事件,data事件将会在流将数据传递给消费者时触发.当流转换到flowing模式时会触发该事件.
  • 'end'事件,end事件只有在数据被完全消费后才会触发.
  • 'error'事件,error事件会在底层系统内部出错从而不能产生数据,或当流的实现试图传递错误数据时发生.
  • 'readble'事件,readable事件将在流中有数据可供读取时触发.

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# nodejs  #   # node  # 可读流  # fs  # 读取文件流  # Node.js中的流(Stream)的作用详解  # node.js同步/异步文件读写-fs  # Stream文件流操作实例详解  # Node.js数据流Stream之Duplex流和Transform流用法  # Node.js数据流Stream之Readable流和Writable流用法  # node.js中stream流中可读流和可写流的实现与使用方法实例分析  # node.js使用stream模块实现自定义流示例  # Node.js中你不可不精的Stream(流)  # Node.js中的流(Stream)介绍  # Node.js 中的流Stream模块简介及如何使用流进行数据处理  # 可以通过  # 将在  # 两种  # 会在  # 双工  # 切换到  # 都是  # 将会  # 不需要  # 模式下  # 才会  # 中有  # 给大家  # 不存在  # 三种  # 可供  # 写到  # 发送到  # 这篇文章  # 有两种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python并发异常传播_错误处理解析【教程】  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  教你用AI润色文章,让你的文字表达更专业  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel如何使用Eloquent进行子查询  PHP 500报错的快速解决方法  Python函数文档自动校验_规范解析【教程】  如何在云虚拟主机上快速搭建个人网站?  nodejs redis 发布订阅机制封装实现方法及实例代码  如何快速上传建站程序避免常见错误?  如何在腾讯云服务器快速搭建个人网站?  中山网站制作网页,中山新生登记系统登记流程?  如何选择可靠的免备案建站服务器?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何在局域网内绑定自建网站域名?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel如何创建自定义Facades?(详细步骤)  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  EditPlus中的正则表达式 实战(2)  如何在阿里云完成域名注册与建站?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何快速搭建高效可靠的建站解决方案?  如何快速建站并高效导出源代码?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  JS中对数组元素进行增删改移的方法总结  个人网站制作流程图片大全,个人网站如何注销?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  文字头像制作网站推荐软件,醒图能自动配文字吗?  公司门户网站制作流程,华为官网怎么做?  千库网官网入口推荐 千库网设计创意平台入口  如何在Windows服务器上快速搭建网站?  如何撰写建站申请书?关键要点有哪些?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在IIS管理器中快速创建并配置网站?  黑客入侵网站服务器的常见手法有哪些?  如何在建站宝盒中设置产品搜索功能?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速完成中国万网建站详细流程?