NodeJS —— 自定义流的实现

【WRF-Chem工具】pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量 pyVPRM 计算大气与陆地植被之间的 CO₂ 交换通量 阅读详情

在这里插入图片描述


阅读原文


概述

常见的自定义流有四种,Readable(可读流)、Writable(可写流)、Duplex(双工流)和 Transform(转换流),常见的自定义流应用有 HTTP 请求、响应,crypto 加密,进程 stdin 通信等等。


stream 模块介绍

在 NodeJS 中要想实现自定义流,需要依赖模块 stream,直接引入,不需下载,所有种类的流都是继承这个模块内部提供的对应不同种类的类来实现的。

实现一个自定义可读流 Readable

1、创建自定义可读流的类 MyRead

实现自定义可读流需创建一个类为 MyRead,并继承 stream 中的 Readable 类,重写 _read 方法,这是所有自定义流的固定套路。

// 创建自定义可读流
const { Readable } = require("stream");

// 创建自定义可读流的类
class MyRead extends Readable {
    constructor() {
        super();
        this.index = 0;
    }

    // 重写自定义的可读流的 _read 方法
    _read() {
        this.index++;
        this.push(this.index + "");

        if (this.index === 3) {
            this.push(null);
        }
    }
}

我们自己写的 _read 方法会先查找并执行,在读取时使用 push 方法将数据读取出来,直到 push 的值为 null 才会停止,否则会认为没有读取完成,会继续调用 _read。

2、验证自定义可读流

// 验证自定义可读流
let myRead = new MyRead();

myRead.on("data", data => {
    console.log(data);
});

myRead.on("end", function() {
    console.log("读取完成");
});

// <Buffer 31>
// <Buffer 32>
// <Buffer 33>
// 读取完成

实现一个自定义可写流 Writable

1、创建自定义可写流的类 MyWrite

创建一个类名为 MyWrite,并继承 stream 中的 Writable 类,重写 _write 方法。

// 创建自定义可写流
const { Writable } = require("stream");

// 创建自定义可写流的类
class MyWrite extends Writable {
    // 重写自定义的可写流的 _write 方法
    _write(chunk, encoding, callback)) {
        callback(); // 将缓存区写入文件
    }
}

写入内容时默认第一次写入直接写入文件,后面的写入都写入缓存区,如果不调用 callback 只能默认第一次写入文件,调用 callback 会将缓存区清空并写入文件。

2、验证自定义可写流

// 验证自定义可写流
let myWrite = new MyWrite();

myWrite.write("hello", "utf8", () => {
    console.log("hello ok");
});

myWrite.write("world", "utf8", () => {
    console.log("world ok");
});

// hello ok
// world ok

实现一个自定义双工流 Duplex

1、创建自定义可双工流的类 MyDuplex

双工流的可以理解为即可读又可写的流,创建一个类名为 MyDuplex,并继承 stream 中的 Duplex 类,由于双工流即可读又可写,需重写 _read 和 _write 方法。

// 创建自定双工流
const { Duplex } = require("stream");

// 创建自定义双工流的类
class MyDuplex extends Duplex {

    // 重写自定义的双工流的 _read 方法
    _read() {
        this.push("123");
        this.push(null);
    }

    // 重写自定义的双工流的 _write 方法
    _write(chunk, encoding, callback)) {
        callback();
    }
}

双工流分别具备 Readable 和 Writable 的功能,但是读和写互不影响,互不关联。

2、验证自定义双工流

// 验证自定义双工流
let myDuplex = new MyDuplex();

myDuplex.on("readable", () => {
    console.log(myDuplex.read(1), "----");
});

setTimeout(() => {
    myDuplex.on("data", data => {
        console.log(data, "xxxx");
    });
}, 3000);

// <Buffer 31> ----
// <Buffer 32> xxxx
// <Buffer 32> ----
// <Buffer 33> xxxx

如果 readable 和 data 两种读取方式都使用默认先通过 data 事件读取,所以一般只选择一个,不要同时使用,可读流的特点是读取数据被消耗掉后就丢失了(缓存区被清空),如果非要两个都用可以加一个定时器(绝对不要这样写)。


实现一个自定义转化流 Transform

1、创建自定义可转化流的类 MyTransform

转化流的意思是即可以当作可读流,又可以当作可写流,创建一个类名为 MyTransform,并继承 stream 中的 Transform 类,重写 _transform 方法,该方法的参数和 _write 相同。

// 创建自定义转化流
const { Transform } = require('stream');

// 创建自定义转化流的类
class MyTransform extends Transform {

    // 重写自定义的转化流的 _transform 方法
    _transform(chunk, encoding, callback)) {
        console.log(chunck.toString.toUpperCase());
        callback();
        this.push('123');
    }
}

在自定义转化流的 _transform 方法中,读取数据的 push 方法和 写入数据的 callback 都可以使用。

由此可以看出,Transform 类型可以将可读流转化为可写流,也可以将可写流转化成可读流,他的主要目的不是像其他类型的流一样负责数据的读写,而是既作为可读流又作为可写流,实现流的转化,即实现对数据的特殊处理,如 zib 模块实现的压缩流,cropo 模块实现的加密流,本质都是转化流,将转化流作为可写流,将存储文件内容的可写流通过 pipe 方法写入转化流,再将转化流作为可读流通过 pipe 方法将处理后的数据响应给浏览器。

2、验证自定义转化流

// 验证自定义转化流
let myTransForm = new MyTransform();

// 使用标准输入
process.stdin.pipe(myTransForm).pipe(process.stdin);

打开命令行窗口执行 node demo.js,然后输入 abc,会在命令窗口输出 ABC 和 123,其实转换流先作为一个可写流被写入到标准输入中,而此时 stdin 的作用是读流,即读取用户的输入,读取后转换流作为一个可读流调用 pipe,将用户输入的信息通过标准输出写到命令行窗口,此时 stdout 的作用是写流。


总结

自定义流最常见的种类在上面都已经涵盖了,真正的在开发中用到的不多,如果需要写一个自定义流应该比上面的复杂很多,本文主要目的是认识什么是自定义流,并了解写一个自定义流的基本套路。


基于STM32的室内环境监测系统设计与实现 摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F 阅读详情

相关推荐

FPGA实战:基于Basys3的多功能数字钟设计与实现

本文详细介绍了基于Basys3开发板的多功能数字钟设计与实现过程,涵盖FPGA开发、SystemVerilog编程及7段数码管驱动等关键技术。通过模块化设计实现时钟分频、时间计数、按键处理等功能,并提供了优化显示驱动和调试技巧,帮助开发者快速掌握数字电路设计核心概念。

weixin_29186249的博客 659

NodeJS 说说“重写” 自定义stream 的实现

概述常见的自定义流有四种,Readable(可读流)、Writable(可写流)、Duplex(双工流)和 Transform(转换流),常见的自定义流应用有 HTTP 请求、响应,crypto 加密,进程 stdin 通信等等。stream 模块介绍在 NodeJS 中要想实现自定义流,需要依赖模块 stream,直接引入,不需下载,所有种类的流都是继承这个模块内部提供的对应不同种类的类来实现的...

weixin_33690367的博客 852

保姆级教程:用MATLAB搞定运动模糊图片修复(附完整代码与避坑指南)

本文提供了一份详细的MATLAB运动模糊图片修复教程,涵盖盲复原、图像复原等核心技术。通过傅里叶变换和Radon变换分析模糊参数,对比逆滤波、维纳滤波和Lucy-Richardson算法效果,并附完整代码与避坑指南,帮助用户实现专业级图像处理。

weixin_26765363的博客 230

Stream流

可变参数 可变参数: 作为方法的形式参数,减少重载方法的书写,相当于一个数组 格式: 方法定义的形式参数()内 数据类型...变量名 -- 相当于定义了一个该数据类型的数组(可以接收该类型数据的数组),接收方法的实际参数 要想使用可变参数接收的数据,需要遍历 注意事项: 如果方法形式参数列表中存在可变参数,可变参数写在形式参数列表的最后一个位置 好处: 1.简化方法的书写 JDK1.5之前,需要定义数组,并且实际参数要封装到数组中才能使用 JDK1.5及之后,出现可变参数,不需要封

qq_45753879的博客 324

超螺旋滑模控制(STA)

超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。

Lyajpunov的博客 1万+

BLDC方波控制双闭环Simulink仿真模型

无刷直流电机方波控制双闭环Simulink仿真模型搭建详细教程,包括速度PI环、电流PI环、换向逻辑和受控电压源,仿真结果良好。

m0_57458432的博客 6870

Node.js Readable流作为Duplex流的数据源

Node.js Readable流作为Duplex流的数据源 Stream是计算机中数据读写的的一种抽象,基本上每种编程语言都会有它的身影,Node.js也不列外,想要深入理解和使用Node.js,就必须掌握Stream在Node.js下的工作原理。 本篇文章不是为了介绍Node.js下的Stream的工作原理,而是基于大家对Stream有一定的了解,然后向大家介绍一种将Readable流作为...

沙沙罗曼的专栏 1080

交换机背板带宽、交换容量与包转发率到底是啥?

在网络工程中,交换机是核心设备之一,而关于它的性能指标,背板带宽、交换容量、以及包转发率往往成为人们衡量其性能的重要参数。这些术语的定义、关系、以及在实际场景中的应用,都对交换机的选型与部署有着重要意义。本文将为您全面解读这些概念,帮助您深入了解交换机的核心性能指标。

网络技术联盟站 1549

十--nodejs原理(stream)

一、stream shell通过管道|连接各部分,其输入输出的规范是文本流,在Node.js中,内置的Stream模块也实现了类似功能,各部分通过.pipe()连接。 Stream提供了以下四种类型的流: var Stream = require('stream'); var Readable = Stream.Readable; var Writable = Stream.Writable; var Duplex = Stream.Duplex var Transform = Stream.Transfo

chujinmaolu的博客 421

10、高阶ΣΔ调制器设计与优化

本文深入探讨了高阶ΣΔ调制器的设计与优化技术,重点介绍了NTF零点优化方法,通过分散单位圆上的零点分布提升信噪失真比(SQNR)。文章分析了量化噪声耦合技术如何有效提高噪声整形阶数,并对比了CIFB、CIFF、CRFB和CRFF等不同架构的性能特点。同时,详细阐述了基于稳定性与性能权衡的设计流程,结合Schreier的Delta-Sigma Toolbox实现NTF综合与仿真验证。内容涵盖从理论推导到实际设计步骤,为高阶ΣΔ调制器的稳定性提升与性能优化提供了系统性指导。

tgb345678的博客 134

R语言机器学习:XGBoost线性回归模型的SHAP值

SHAP(SHapley Additive exPlanations)值是一种基于博弈论Shapley值的机器学习模型解释方法,能够解释任何模型的预测结果。其主要用途包括:1)提高模型的可解释性,帮助非技术用户理解模型预测;2)识别对模型预测最重要的特征,辅助特征选择;3)调试模型,发现预测中的异常;4)评估模型公平性,避免偏见。SHAP值的计算方法包括初始化、迭代计算、归一化和解释,常用工具如Python的shap库支持多种计算方式(如TreeSHAP、KernelSHAP等)。本文还提供了基于R语言计算

专注生信领域 3441

node那点事(一) -- Readable streams(可读流)

流的简介 流(stream)在 Node.js 中是处理流数据的抽象接口(abstract interface)。 stream 模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。 Node.js 提供了多种流对象。 例如, HTTP 请求 和 process.stdout 就都是流的实例。 流可以是可读的、可写的,或是可读写的。所有的流都是 EventEmitte...

weixin_33872566的博客 436

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

NodeJS —— 流的原理分析与简易实现

原文出自:https://www.pandashen.com 前言 在之前的博客中已经了解了流的基本用法,这篇的重点在于根据可读流的用法对可读流的原理进行分析,实现简易版的 ReadStream,流的基本用法请看这里 NodeJS —— Stream 的基本使用。 可读流的实现(流动模式) 1、ReadStream 类创建 在使用 fs 的 createReadStream 创建可读流时,...

github_38140984的博客 811

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js实现审批流_Nodejs Stream pipe 的使用与实现原理分析

通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来,而无需一次性全部读入,在 Linux 下我们可以通过 | 符号实现,类似的在 Nodejs 的 Stream 模块中同样也为我们提供了 pipe() 方法来实现。1. Nodejs Stream pipe 基本示例选择 Koa 来实现这个简单的 Demo,因为之前有人在 “Nodejs技术栈” 交流群问过一个问题,怎么在 Koa 中返回一...

weixin_34365489的博客 1209

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NodeJS实现一个聊天室

看效果 一直说我喜欢卖关子,这次直接看效果: 前文 先说一下为什么写这个东西,最近不是在写NodeJS知识点的梳理嘛,但是我发现梳理的过程着实无聊的要死,虽然已经快梳理一半了,只是还没发布,这个不重要,重要的是不做点什么东西确实无聊,所以今天把我做这个的过程记录给你们看一下,喜欢的可以拿去玩玩。 客户端代码 <!DOCTYPE html> <html> <head...

红岸基地 2998

Nodejs流相关知识

Nodejs流相关知识

在所有的事情背后,要有一颗坚定的的本心,要有一颗应对变革和提升自我的本心,世界瞬息万变,本心要坚持到底,保持学习,时刻复盘 1191

Nodejs流模块

Node.js Stream模块 一、 Readable流 事件: 1、 readable:在数据块可以从流中读取的时候发出。 2、 data:类似于readable,不同之处:当数据的事件处理程序被连接时,流被转变成流动的模式,且数据块处理程序被连续的调用,直至所有数据被调用完。 3、 end:当数据将不再被提供时由流发出 4、 close:关闭时 5、 error:接受数据中出现错误时发出 方

lxn11140的博客 451

如何理解并利用NodeJS中的Streams

如何理解并利用NodeJS中的Streams 1. 项目基础介绍及编程语言 本项目是由David Gatti创建的一个开源项目,旨在逐步解释和演示如何在NodeJS中利用Streams(流)。Stream是NodeJS中一个非常强大的功能,可以有效地处理数据的读写操作。本项目主要通过JavaScript编程语言,使用NodeJS环境,为开发者提供了一个学习和实践Streams概念的平台。 2. 项...

gitblog_00936的博客 535

NodeJs标准库——流(Stream)的实现原理

Node.js streams(流)因其晦涩难懂以及难以使用而闻名。不过读了这篇文章之后,这些都难不倒你了,本文通过解剖流的实现原理来学习流。

qq_43778239的博客 1420

什么是Nodejs的流 它们有什么作用

引言流的基本概念和作用说明什么是流?流的作用使用流的不同角度的功能思路示例一:创建和使用基本的可读流示例二:创建和使用基本的可写流示例三:使用管道连接流示例四:处理错误和关闭事件示例五:结合异步操作使用流实际工作开发中的使用技巧确保流的安全性控制资源消耗优化性能日志记录集成测试实际案例分享流是Node.js中的一种抽象接口,用于表示一系列连续的数据块。它允许开发者逐步处理数据,而不是一次性加载整个数据集到内存中。Readable:可读流,用于从源读取数据。例如,文件读取、网络请求等。Writable。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 675

nodejs中的写入流、读取流和管道流

1 写入流 fs.createWriteStream 文件系统实现了写入流的接口 一点点写 , 最后触发 end之后 finish 才算写完。 2 读取流 fs.createReadStream 读取流的接口 一点点(缓冲区)。 最后要合成。 http中request 也实现了 stream流 Readable 读取流 post 提交数据 就需要通过 流的方式取值。 //读取流...

gfei1234的博客 1971

nodejs流

流数据是指一组顺序、大量、快速、连续到达的数据序列,一般情况下数据流可被视为一个随时间延续而无限增长的动态数据集合。流数据应用于网络监控、传感器网络、航空航天、气象测控和金融服务等领域。与静态数据不同,流数据是实时生成的,需要实时处理和分析。Nodejs 中的流(Stream)是用来比喻数据传输的一种形式,数据传输的起点就是流的源头,数据传输的终点就是流的终点。

CodePrincess的博客 1114

浅析nodejs中的stream(流)

这篇文章我们来聊一下nodejs中的stream,也就是nodejs中的流。 什么是流呢?从字面上来看我们应该可以想到水流,对吧。那我们不妨想一下水流有什么特点呢? 比如我们日常生活中的水龙头,流出来的水是有序且有方向的。 nodejs中的流也是一样,是有序且有方向的。 nodejs中有许多的对象或者方法都用到了流。比如说HTTP 请求和process.stdout就都是流的实例。 ...

包磊磊的博客 4948

NodeJS WriteStream写入流

ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(如果调试程序是移除 bug 的过程,那编写程序就是把 bug 放进来的过程。—— 迪杰 · 斯特拉) ㅤㅤㅤ ㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ...

Nodejs 4545
上一篇: NodeJS —— 流的原理分析与简易实现
下一篇: 使用 NodeJS 可读流实现 “行读取器”
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值