【Node系列】node中的流(Stream)

文章目录

  • 一、流(Stream)
  • 二、四种基本流的案例
  • 三、组合流:管道流(Pipeline Stream)
  • 四、组合流:链式流(Chaining Stream)
  • 五、热门文章

一、流(Stream)

Node.js 中的流(Stream)是一种处理数据的方式,它允许你以流的方式处理数据,而不是一次性加载整个数据集。这种方式对于处理大量数据非常有用,因为它可以减少内存的使用并提高性能。

Node.js 提供了几种不同类型的流,包括:

  1. 可读流(Readable Stream):用于从数据源读取数据。例如,当你想从一个文件或网络连接中读取数据时,可以使用可读流。
  2. 可写流(Writable Stream):用于将数据写入目标。例如,当你想将数据写入文件或网络连接时,可以使用可写流。
  3. 双向流(Duplex Stream):同时具有可读和可写的能力。例如,net.Socketfs.ReadStream 都是双向流。
  4. Transform 流:在读取和写入过程中对数据进行转换。例如,zlib 模块提供了压缩和解压缩的 Transform 流。

使用 Node.js 流的基本步骤如下:

  1. 创建一个流对象(例如,使用 fs.createReadStream()fs.createWriteStream())。
  2. 监听 ‘data’ 事件来接收从流中读取的数据。
  3. 监听 ‘end’ 事件来知道何时数据已经读取完毕。
  4. 监听 ‘error’ 事件来处理可能发生的错误。

二、四种基本流的案例

Node.js 中有四种不同类型的流:可读流(Readable Stream)、可写流(Writable Stream)、双向流(Duplex Stream)和转换流(Transform Stream)。

  1. 可读流(Readable Stream):这种类型的流主要用于从数据源读取数据。当数据准备好后,可以通过监听 ‘data’ 事件来获取数据。当没有数据可读时,可以通过监听 ‘end’ 事件来知道何时数据已经读取完毕。

案例:从文件读取数据

const fs = require('fs');const readStream = fs.createReadStream('input.txt');readStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);
});readStream.on('end', () => {console.log('No more data.');
});
  1. 可写流(Writable Stream):这种类型的流主要用于将数据写入目标。可以通过监听 ‘drain’ 事件来知道何时可以继续写入数据。当写入过程中发生错误时,可以通过监听 ‘error’ 事件来处理错误。

案例:将数据写入文件

const fs = require('fs');const writeStream = fs.createWriteStream('output.txt');writeStream.write('Hello, World!');
writeStream.end();
  1. 双向流(Duplex Stream):这种类型的流同时具有可读和可写的能力。例如,net.Socketfs.ReadStream 都是双向流。双向流可以同时处理数据的读取和写入。

案例:通过 net 模块创建一个 TCP 服务器,并使用双向流处理客户端的连接和数据传输。

const net = require('net');const server = net.createServer((socket) => {socket.write('Hello, client!');socket.end();
});server.listen(8000);
  1. 转换流(Transform Stream):在读取和写入过程中对数据进行转换。例如,zlib 模块提供了压缩和解压缩的 Transform 流。可以通过在 ‘data’ 事件回调中返回一个对象来转换数据,并使用 ‘push’ 方法将结果推回流中。当没有更多数据可以读取或写入时,可以通过监听 ‘end’ 或 ‘finish’ 事件来知道何时结束转换。
const fs = require('fs');  
const zlib = require('zlib');  // 创建一个可读流  
const readableStream = fs.createReadStream('input.txt');  // 创建一个转换流,用于压缩数据  
const transformStream = zlib.createGzip();  // 创建一个可写流,用于将压缩后的数据写入文件  
const writableStream = fs.createWriteStream('output.gz');  // 将可读流、转换流和可写流连接起来  
readableStream.pipe(transformStream).pipe(writableStream);

三、组合流:管道流(Pipeline Stream)

管道流(Pipeline Stream)是一种特殊的流操作,它通过将多个流连接在一起,实现数据的连续处理和传输。在 Node.js 中,可以通过将多个流连接在一起,形成一个管道流,以便将数据从一个流中传递到另一个流中。

管道流通常用于将数据从一个操作转换到另一个操作,例如从读取文件到压缩数据,或者从解压缩数据到写入文件。通过将多个流连接在一起,可以轻松地处理数据的读取、转换和写入操作。

案例:读取文件、压缩数据和写入文件

const fs = require('fs');
const zlib = require('zlib');// 创建一个可读流,用于读取文件
const readableStream = fs.createReadStream('input.txt');// 创建一个转换流,用于压缩数据
const transformStream = zlib.createGzip();// 创建一个可写流,用于将压缩后的数据写入文件
const writableStream = fs.createWriteStream('output.gz');// 将可读流、转换流和可写流连接起来,形成一个管道流
readableStream.pipe(transformStream).pipe(writableStream);

在这个例子中,我们首先创建了一个可读流,用于读取名为 input.txt 的文件。然后,我们创建了一个转换流,使用 Gzip 算法对数据进行压缩。接下来,我们创建了一个可写流,用于将压缩后的数据写入名为 output.gz 的文件中。最后,我们将可读流、转换流和可写流连接起来,形成一个管道流。当程序运行时,它将读取 input.txt 文件中的内容,使用 Gzip 算法进行压缩,并将压缩后的数据写入 output.gz 文件中。

四、组合流:链式流(Chaining Stream)

链式流(Chaining Stream)是一种通过连接多个流操作来处理数据的机制。在 Node.js 中,可以通过将多个流连接在一起,形成一个链式流,以便将数据从一个流传递到另一个流。

链式流通常用于将多个操作串联起来,例如从读取文件到压缩数据,再到写入文件。通过将多个流连接在一起,可以轻松地处理数据的读取、转换和写入操作。

案例:读取文件、压缩数据和写入文件

const fs = require('fs');
const zlib = require('zlib');// 创建一个可读流
const readableStream = fs.createReadStream('input.txt');// 创建一个转换流,用于压缩数据
const transformStream = zlib.createGzip();// 创建一个可写流,用于将压缩后的数据写入文件
const writableStream = fs.createWriteStream('output.gz');// 将可读流和转换流连接起来,形成一个链式流
readableStream.pipe(transformStream);// 将链式流的输出连接到可写流中
transformStream.pipe(writableStream);

在这个例子中,我们首先创建了一个可读流,用于读取名为 input.txt 的文件。然后,我们创建了一个转换流,使用 Gzip 算法对数据进行压缩。接下来,我们创建了一个可写流,用于将压缩后的数据写入名为 output.gz 的文件中。最后,我们将可读流和转换流连接起来,形成一个链式流。然后,我们将链式流的输出连接到可写流中。当程序运行时,它将读取 input.txt 文件中的内容,使用 Gzip 算法进行压缩,并将压缩后的数据写入 output.gz 文件中。

五、热门文章

  1. 【Node系列】连接数据库
  2. 【Node系列】模块系统
  3. 【Node系列】Node全局对象
  4. 【Node系列】node工具模块
  5. 【Node系列】Buffer详解
  6. 【Node系列】node核心模块util
  7. 【Node系列】常用工具介绍
  8. 【Node系列】EventEmitter详解

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

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

相关文章

idea: 无法创建Java Class文件(SpringBoot)已解决

第一:点击file-->project Sructure... 第二步:点击Moudules 选择自己需要创建java的文件夹(我这里选择的是main)右键点击Sources,然后点击OK即可 然后就可以创建java类了

第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、OpenCV图像特征提取与描述介绍二、OpenCV图像特征提取与描述初步示例代码三、扩展思路介绍四、特征点筛选和匹配优化示例代码五、多尺度特征提取示例代码六、非局部特征描述子示例代码…

Quartus工程的qsf配置约束文件介绍

一、qsf文件概述 qsf:Quartus Setting File,是Quartus工程的配置文件; 包含一个Quartus工程的所有约束,包括工程的软件版本信息、FPGA器件信息、引脚约分配、引脚电平分配,编译约束和用于Classic TimingAnalyzer的时…

c#stream

在C#中,Stream 是一个抽象基类,用于处理输入和输出的字节序列。它是所有输入/输出 (I/O) 操作的基础,包括文件操作、网络操作、内存操作等。Stream 类提供了一组方法和属性,使得可以对数据进行读取、写入和定位。下面是一些Stream…

Python爬虫 pyquery库详解

使用 pyquery 在上一节中,我们介绍了 Beautiful Soup 的用法,它是一个非常强大的网页解析库,你是否觉得它的一些方法用起来有点不适应?有没有觉得它的 CSS 选择器的功能没有那么强大? 如果你对 Web 有所涉及&#xf…

3分钟部署完成Docker Registry及可视化管理工具Docker-UI

安装docker-registry 由于镜像文件会非常占用空间,因此需要选择一个磁盘充裕的位置来存放镜像数据。 这里设置为:-v /data/registry:/var/lib/registry,其中/data/registry是宿主机存放数据的位置。 docker run -d -p 5000:5000 --restart…

[职场] 智能材料与结构专业的就业前景 #经验分享#学习方法

智能材料与结构专业的就业前景 智能材料与结构专业是面向国家智能制造强国战略,面向地方经济新旧动能转换需求,学习智能材料与结构的基础理论及基本知识,接受智能材料制备、组织分析、性能测试、智能材料系统集成技能的基本训练,…

【QT】day6

#include "home.h" #include "ui_home.h"Home::Home(QWidget *parent): QWidget(parent), ui(new Ui::Home) {ui->setupUi(this);// 从配置文件读取用户名QSettings settings("kim", "ad");username settings.value("usernam…

【03】C++ 类和对象 2:默认成员函数

文章目录 🌈 前言🌈 Ⅰ 构造函数1. 构造函数概念2. 构造函数特性3. 初始化列表 🌈 Ⅱ 析构函数1. 析构函数概念2. 析构函数特性 🌈 Ⅲ 拷贝构造1. 拷贝构造概念2. 拷贝构造特性3. 深度拷贝构造 🌈 Ⅳ 赋值重载1. 运算符…

ruoyi若依框架SpringSecurity实现分析

系列文章 ruoyi若依框架学习笔记-01 ruoyi若依框架分页实现分析 ruoyi若依框架SpringSecurity实现分析 文章目录 系列文章前言具体分析一、项目中的SpringSecurity版本二、登录认证流程分析三、权限鉴定四、退出登录五、SpringSecurity配置类 总结 前言 在ruoyi-vue若依框…

单片机的省电模式及策略

目录 一、单片机省电的核心策略 二、单片机IO口的几种模式 三、单片机的掉电运行模式 (1) 浅谈cpu运行为什么会需要时钟? (2)STC15系列单片机内部可以配置时钟 (3)分频策略,降低…

数据结构与算法之美学习笔记:51 | 并行算法:如何利用并行处理提高算法的执行效率?

目录 前言并行排序并行查找并行字符串匹配并行搜索总结引申 前言 本节课程思维导图: 时间复杂度是衡量算法执行效率的一种标准。但是,时间复杂度并不能跟性能划等号。在真实的软件开发中,即便在不降低时间复杂度的情况下,也可以…

Java面试题2024(Java面试八股文)

文章目录 基础Springspring Mybatis数据库Mysql redis并发编程网络通信消息队列MQ分布式分布式事务 设计模式 更新中 基础 Java基础 Java对象的创建 集合 HashMap详解 HashMap实现原理 ConcurrentHashMap原理详解 反射 JAVA反射详解 异常 Java 的异常体系 泛型 Java泛型详解 …

Linux应用开发---网络通信

Linux应用开发—网络通信 1 网络通信概述 Linux下的网络编程,我们一般称为 socket 编程,socket 是内核向应用层提供的一套网络编程接口,我们可以基于socket接口开发自己的网络相关应用程序。 1.1 socket 简介 套接字(socket&…

Jenkins升级后,构建任务配置界面重复错位

最近我把公司的Jenkins服务升级到了最新版本,升级完成后,点了一下构建任务,发现能够构建成功,就以为顺利完成升级了,下班走了,结果第二天,进入构建任务配置界面发现,界面一团乱麻&am…

LabVIEW热电偶自动校准系统

设计并实现一套基于LabVIEW平台的工业热电偶自动校准系统,通过自动化技术提高校准效率和精度,降低人力成本,确保温度测量的准确性和可靠性。 工业生产过程中,温度的准确测量对产品质量控制至关重要。传统的热电偶校准方式依赖人工…

[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07

LeetCode 热题 100---04~07 第一题:移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

v-if 和v-for的联合规则及示例

第073个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

pytest+allure批量执行测试用例

在 Pytest 中,可以使用装饰器 `@pytest.fixture` 来定义用例级别的前置和后置操作。下面是一个示例代码,演示了如何使用 Pytest 的前置和后置操作: ```python import pytest @pytest.fixture(scope="function") def setup_function(): print("Setup fu…