Node.js 流 Stream【详解】

news2024/11/15 4:16:58

什么是流?

流是一种将整体数据分割成多个小块依次进行处理的方式。

举个形象的例子:
山上有1000颗拳头大的小石子,需要搬下山。

  • 传统的处理方式:安排一辆大卡车,一次性将石子全部运下山。
  • 流的处理方式:修建一条管道,将小石子一颗颗的丢进管道,自己滚下山。

在这里插入图片描述

流的类型

共四种:

  • Readable -可读流【数据源】-- 可读
  • Writable -可写流-- 可写
  • Duplex -双向流-- 可读+可写
  • Transform -转换流【数据加工厂】-- 操作被写入数据,然后读出结果。

流的事件和方法

在这里插入图片描述

常用事件有:

  • 可读流读取数据时触发 data 事件
// chunk 为数据片段
readableSrc.on("data", (chunk) => {});
  • 可读流读取数据完成时触发 end 事件
// chunk 为数据片段
readableSrc.on("end", (chunk) => {});
  • 可写流写完数据时触发 finish 事件

可读流的常用方法有:

  • 用管道传输 pipe()
  • 关闭管道传输 unpipe()
  • 读取数据 read ()
  • 将数据推回内部缓冲区 unshift()
  • 继续读取数据 resume()
  • 暂停传输 pause()
  • 判断是否暂停传输 isPaused()
  • 指定编码类型 setEncoding()

可写流的常用方法有:

  • 写入 write()
  • 结束写入 end()
  • 将数据写入内存 cork()
  • 取消写入内存 uncork()
  • 指定默认编码类型 setDefaultEncoding()

Node.js 内支持流的内置模块

在这里插入图片描述

流的使用

读取文件输出到控制台

import { createReadStream } from "fs";

// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 将可读流的内容输出到控制台
readableSrc.pipe(process.stdout);

读取文件并输出到新文件

import { createReadStream, createWriteStream } from "fs";

// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 创建可写流
const writeSrc = createWriteStream("./test2.txt");
// 将可读流的内容通过管道传输到可写流中
readableSrc.pipe(writeSrc);
// 若不存在test2.txt,则会创建test2.txt,内容与test.txt相同
// 若已存在test2.txt,则会清空test2.txt的原内容,并将test.txt的内容写入其中,最终test2.txt的内容与test.txt相同

最后的 pipe 相当于

// chunk 为数据片段
readableSrc.on("data", (chunk) => {
  writeSrc.write(chunk);
});

readableSrc.on("end", () => {
  writeSrc.end();
});

读取文件并压缩打包

import { createReadStream, createWriteStream } from "fs";
// 导入方法--创建.gz的压缩包
import { createGzip } from "zlib";
// 创建可读流
const readableSrc = createReadStream("./test.txt");
// 创建可写流
const writeSrc = createWriteStream("./test.gz");
// 先将可读流的内容通过管道传输到转换流进行压缩打包
// 再将转换流中的压缩包数据通过管道传输到可写流中
readableSrc.pipe(createGzip()).pipe(writeSrc);

此处的 createGzip() 是一个转换流

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx制作下载站点

nginx使用的是模块ngx_http_autoindex_module来实现的,该模块处理以斜杠(“/”)结尾的请求,并生成目录列表。 nginx编译的时候会自动加载该模块,但是该模块默认是关闭的,使用下来指令来完成对应的配置 autoindex 启用或禁用目录…

医疗器械许可证怎么办理

医疗器械经营许可证申请条件 1.有两个与业务规模和业务范围相适应的质量管理机构或大专以上学历的质量管理人员。质量管理人员应具有国家认可的相关专业资格或职称; 2.具有与经营规模和范围相适应的相对独立的经营场所; 3.具备与经营规模和经营范围相…

解读OpenShift的逻辑架构和技术架构

01 OpenShift的逻辑架构 OpenShift的逻辑架构图如图2-6所示。 ▲图2-6 OpenShift逻辑架构 图2-6中的关键组件介绍如下。 底层基础设施:OpenShift可以运行在公有云(AWS、Azure、Google等)、私有云(OpenStack)、虚拟机(vSphere、RHV、红帽KVM)、X86、IBM Power/Z服务器上。…

跨域及cors解决跨域

1.什么是跨域 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的…

DJ11 8086系列处理器(第二节课)

目录 一、8088CPU的系统总线 1. 最小模式 2. 最大模式 二、8086/8088 CPU 的功能结构 1. 8086/8088 CPU 的内部结构 2. 8086/8088 CPU 的内部寄存器 1)通用寄存器 2)段寄存器 3)控制寄存器 三、8086/8088 CPU 的存储器组织 1. 物…

超级账本Fabric的世界状态操作与账本操作

在 Hyperledger Fabric 中,账本由两个不同但相关的部分组成 - 世界状态和区块链。 世界状态: 一个数据库,其中存储了一组帐本状态的当前值的缓存。世界状态使程序可以轻松地直接访问状态的当前值,而不必通过遍历整个交易日志来计…

PROTAC与抗体偶联药物的结合

PROTAC 的靶点真核生物的蛋白降解途径主要分为溶酶体途径、泛素蛋白酶体途径、胞液蛋白酶水解途径和线粒体蛋白酶途径等四种 (图1)。其中,PROTAC 所依赖的蛋白酶体途径主要针对细胞周期蛋白、转录因子、细胞表面受体以及胞内变性蛋白等进行降解。 图 1. 不同蛋白降…

《安富莱嵌入式周报》第291期:分分钟设计数字芯片,单片机版JS,神经网络DSP,microPLC,FatFS升级至V0.15,微软Arm64 VS正式版发布

往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1Dd4y1b74x 《安富莱嵌入式周报》第291期:分分…

分享几个小技巧教你图片怎么加边框

大家平时出去玩的时候,肯定没少拍摄照片吧?那你们都是怎么对图片进行修饰的呢?我比较喜欢给图片加上一些边框线条,这样子的图片会比较有意境,能凸显我想要表达的意思。那么大家知道怎么在图片里加边框吗?今…

【Vue.js设计与实现】第4章 响应系统的作用与实现

前言: 本文是我看的Vue.js设计与实现这本书第二篇 响应系统 的第4章 响应系统的作用与实现的一些总结与收获。 第4章从宏观视角讲述了Vue.js 3.0中响应系统的实现机制。从副作用函数开始,逐步实现一个完善的响应系统,还讲述了计算属性和watch…

java计算机毕业设计基于安卓Android的在线心理咨询与健康App

项目介绍 本文介绍了心理咨询与健康App软件开发建设的意义和国内外发展现状,然后详细描述了所开发手机APP的可行性分析,并分析了手机APP所要实现的功能。因为心里咨询设施较多,而且人口密集,不能更好的管理健康问题,造成需要时人员不必要的身心伤害,所以采用比较方便的、容易便…

Linux基本指令(下)

Linux基本指令(下)前言cat指令more命令less命令head命令tail命令wc指令date指令cal指令find指令grep指令top命令alias命令zip/unzip命令前言 上一篇Linux基本指令主要讲解了关于文件操作方面的指令,接下来这一片Linux基本指令主要讲解一下关…

聊聊推荐系统的评测(下)

这是鼎叔的第三十九篇原创文章。 行业大牛和刚毕业的小白,都可以进来聊聊。 欢迎关注本人专栏和微信公众号《敏捷测试转型》,大量原创思考文章陆续推出。 上篇请查阅:聊聊推荐系统的评测(上) 下篇,我们…

基于SSM的旅游景点购票管理系统

1、项目介绍 基于SSM的旅游景点购票管理系统拥有两种角色,管理员和用户 管理员:用户管理、景点管理、购票管理、酒店管理、客房管理、客房预订管理、轮播图管理等 用户:登录注册、景区购票、评论、预订客房、收藏、发布攻略等 2、项目技术…

App推广渠道追踪技术更新及应用

如今App推广渠道追踪对App厂商来说非常重要,因为App厂商需要通过渠道追踪来寻找成本最低的和价值最高的获客渠道。 但是现在线上渠道的选择五花八门,比如各种新闻门户网站、字节系平台、腾讯系平台等,那么到底该花多少钱去获取用户&#xff…

本地浏览器打开远程服务器上的Jupyter Notebook

文章目录一、配置过程二、其他需求后台运行Jupyter端口映射实验环境及需求:远程服务器配置了 Jupyter Notebook,本地电脑没有相关的环境,想要在服务器端启动 Jupyter Notebook,然后直接从本地浏览器打开进行操作。 一、配置过程 …

【百度AI_文字识别】示例身份证图片识别(代码官方文档完整,只需获得修改参数、下载类)

文章目录提取身份证信息第一步:登录第二步:获取资源第三步:获取access_token参数(AuthService.java)第四步:请求代码Idcard.java第五步:修改Idcard.java文件注意:返回错误提取身份证…

【跨境电商卖家】Instagram营销初学者指南(一):重要性、优势

关键词:跨境电商卖家、instagram营销 1.为什么 Instagram 营销对企业很重要? Instagram 是接触大量受众的完美渠道——每月有超过10 亿活跃用户。平均而言,用户每天在 Instagram 上花费 53 分钟,这使得该平台成为仅次于Facebook的…

微信网页支付小白指南-域内浏览器支付 + 外部浏览器支付

关于微信网页支付,分为微信域内浏览器支付 外部浏览器支付,两者还是稍微有点点区别的,内部浏览器即在微信内打开网页,进行支付,支付调用是需要开通JSAPI支付方式;而外部浏览器「比如浏览器等」则需要开通 …

Leetcode刷题day2|数组二|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

文章目录一、有序数组的平方错误的尝试思路注意AC代码暴力版本双指针方法二、长度最小的子数组错误的尝试思路滑动窗口介绍注意AC代码三、螺旋矩阵错误的尝试思路注意AC代码继承前边循环变量的写法不继承前边循环变量的做法四、数组做题思路总结基本知识解题思路一、有序数组的…