【第2章 Node.js基础】2.7 Node.js 的流(一) 可读流

🌈 Node.js 的流

🚀什么是流

流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的。

我们可以把流看作这些数据的集合,就像液体一样,我们先把这些液体保存在一个容器里(流的内部缓冲区 BufferList),等到相应的事件触发的时候,我们再把里面的液体倒进管道里,并通知其他人在管道的另一侧拿自己的容器来接里面的液体进行处理。

在这里插入图片描述

Node.js中的流是一种处理数据的抽象接口,它提供了一种有效的方式(按需处理数据)来读取或写入大量数据,而无需一次性将整个数据加载到内存中。流可以被视为数据在某段时间内从一个点移动到另一个点的序列,类似于水从一根管子的一端流到另一端。

🚀Node.js流的好处

Node.js流解决了处理大量数据时可能遇到的内存消耗和性能问题。以下是使用Node.js流的好处:

  1. 内存效率:使用流可以按需处理数据,而不需要一次性将整个数据加载到内存中。这意味着即使处理大量数据,也可以节省大量的内存空间。流以块的形式处理数据,每次只加载和处理一小部分数据,然后将其释放,从而减少了内存的使用量。

  2. 性能优化:由于流以块的形式处理数据,可以实现并行处理,提高处理速度。流还可以通过流水线(pipeline)的方式将多个操作连接起来,实现数据的连续处理,从而提高整体性能。

  3. 响应性:使用流可以实现实时处理数据,即在数据到达时立即进行处理,而不需要等待整个数据加载完成。这对于需要实时处理数据的应用程序非常重要,例如实时日志分析、实时聊天等。

  4. 可扩展性:流是可组合的,可以将多个流连接起来形成更复杂的数据处理流程。这种可组合性使得代码更加模块化和可重用,便于扩展和维护。

  5. 适用于各种场景:Node.js流可以用于处理各种类型的数据,包括文件、网络请求、数据库查询结果等。无论是处理大文件、处理网络请求还是处理数据库查询结果,使用流都可以提供高效的数据处理方式。

🚀Node.js流的重点知识

以下是关于Node.js流的重点知识点总结:

  1. 流的类型:流可以是可读的、可写的,或者可读可写的。在Node.js中,有四种内置的流类型,
    1. 可读流(Readable)、
    2. 可写流(Writable)、
    3. 双工流(Duplex)
    4. 转换流(Transform)。
  2. 常见的流事件:所有的流都是EventEmitter类的实例,可以通过事件和方法来处理流的数据。
    1. data(当有数据可读时触发)、
    2. end(当没有更多数据可读时触发)
    3. error(当发生错误时触发)等。
  3. 常见的流方法包括
    1. write(向流中写入数据)
    2. read(从流中读取数据)
    3. pipe(将一个可读流的数据传输到一个可写流)等。
  4. 流的工作原理:流将要传输的数据处理成连续的块(chunk),通过一小块一小块地传输数据,从而降低内存消耗并提高性能。这种逐段处理的方式使得流非常适合处理大量数据或需要逐段处理的场景。
  5. 内置的流对象:Node.js中有许多内置的流对象,如HTTP请求、文件读写、标准输入输出(stdin/stdout)等。这些内置的流对象可以直接使用,无需直接实现流的接口。
  6. stream模块:stream模块是用于构建实现流接口的对象的模块,可以通过require('stream')导入。开发人员可以使用stream模块创建自定义的流实例,实现更复杂的流操作。

🌈 可读流

🚀什么是可读流

可读流是对提供数据的来源的一种抽象。可读流的例子包括客户端的 HTTP 响应、服务器的 HTTP请求、fs 的读取流、zlib 流、crypto 流、TCP Socket、子进程 stdout与stderr、process.stdin 等。所有可读流都实现了 stream.Readable 类定义的接口。

fs读取文件案例

文件:fs读取文件.js

const fs = require("fs");
// 创建可读流
const rs = fs.createReadStream("./movie.txt");

let content = "";
// 当有数据可读时触发"data"事件
rs.on("data", chunk => {
    // 将读取的数据块拼接到content变量中
    content += chunk;
});

// 当可读流结束时触发"end"事件
rs.on("end", () => {
    // 所有数据已读取完毕,输出content内容
    console.log(content);
});

文件:movie.txt

The best time to plant a tree is 20 years ago. 
The second-best time is now.
种一棵树最好的时间是20年前,
其次是现在

输出结果

PS D:\WuWorkSpace\code\NodejsProject\nodejs实战学习\【第2章  Node.js基础】\2.7 Node的流> node .\fs可读流.js
The best time to plant a tree is 20 years ago.
The second-best time is now.
种一棵树最好的时间是20年前,
其次是现在
process.stdin案例
 process.stdin.pipe(process.stdout);

这段代码使用了Node.js的process.stdinprocess.stdout流对象,并通过pipe方法将输入流(process.stdin)的数据直接传输到输出流(process.stdout)中。

具体解析如下:

  • process.stdin是一个可读流,它表示标准输入流(stdin),可以用于接收用户的输入。
  • process.stdout是一个可写流,它表示标准输出流(stdout),可以用于向控制台输出数据。

通过调用pipe方法,我们将输入流(process.stdin)连接到输出流(process.stdout),这样输入流中的数据会被自动传输到输出流中。

这段代码的作用是将用户在控制台输入的内容直接输出到控制台,实现了一个简单的输入输出的管道(复读机)。

动图演示如下

在这里插入图片描述

http案例

客户端的 HTTP 响应、服务器的 HTTP请求是可读流。

服务端文件:http-server.js

const http = require("http");
const server = http.createServer((req,res)=>{
    if(req.method === "POST" && req.url.includes("/upload")){
        process.stdout.write("服务端收到了请求:");

        // req 服务器的 HTTP 请求(可读流)
        req.pipe(process.stdout);
        // res 服务器的 HTTP 响应(可写流)
        res.write("我是服务端响应");
        res.end();
    }else{
        res.writeHead(404);
        res.end("Not Found");
    }
})
server.listen(9800);
console.log(`服务已经运行在:http://localhost:9800`);

客户端代码文件:http-client.js

const http = require("http");
const options = {
    hostname : "127.0.0.1",
    port : 9800,
    path : "/upload",
    method : "POST"
};
const req = http.request(options,res=>{
    process.stdout.write("客户端获取响应:");

    // res 客户端的 HTTP 响应(可读流)
    res.pipe(process.stdout);
})

// req 客户端的 HTTP 请求(可写流)
req.write("我是客户端。");
req.end();

以下是运行演示:先运行服务端代码 http-server.js ,再运行客户端代码http-client.js

$ node .\http-client.js
客户端获取响应:我是服务端响应
$ node .\http-server.js
服务已经运行在:http://localhost:9800
服务端收到了请求:我是客户端。

··在这里插入图片描述

🚀可读流de两种模式

可读流有两种模式:流动(Flowing)和暂停(Paused )。在流动模式中,数据被自动从底层系统读取,并通过 EventEmitter 接口的事件尽可能快地提供给应用程序。在暂停模式中,必须显式调用stream.read()方法读取数据块。
所有可读流一开始都处于暂停模式,,之后可以通过以下方式切换到流动模式。

  • 添加data 事件处理函数。
  • 调用stream.resume()方法。
  • 调用 stream.pipe()方法。

可读流也可以通过以下方式切换回暂停模式。

  • 如果没有管道目标,则调用 stream.pause()方法
  • 如果有管道目标,则移除所有管道目标。调用 stream.unpipe()方法可以移除多个管道目标。

注意​ 👉: ​ 只有提供了数据消费或忽略数据的机制后,可读流才会产生数据。如果消费的机制被禁用或移除,则可读流会停止产生数据。

stream.Readable类定义的主要事件:

  • data:当有数据可读时被触发。
  • end:没有更多的数据可读时被触发。
  • close:当流或其底层资源被关闭时被触发。

stream.Readable 类定义的主要方法

  • readable.read([size]):从内部缓冲区拉取并返回数据。
  • readable.pause():使流动模式的流停止触发data事件,并切换出流动模式。
  • readable.setEncoding(encoding):为从可读流读取的数据设置字符编码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows SmartScreen中的漏洞!

🔥另一个流行漏洞是 CVE-2023-36025 - 绕过 Windows SmartScreen 安全功能,该功能是多个微软产品的网络钓鱼和恶意软件保护组件。 👾有多危险 利用该漏洞,攻击者可以绕过 Windows Defender SmartScreen 检查和相关警告。利用该漏…

【Python】Pandas(学习笔记)

一、Pandas概述 1、Pandas介绍 2008年WesMcKinney开发出的库,专门用于数据挖掘的开源python库 以Numpy为基础,借力Numpy模块在计算方面性能高的优势 基于matplotib,能够简便的画图 独特的数据结构 import pandas as pd2、Pandas优势 便…

Dart 3.2 更新,Flutter Web 的未来越来越明朗

参考原文:https://medium.com/dartlang/dart-3-2-c8de8fe1b91f 本次跟随 Flutter 3.16 发布 的 Dart 3.2 ,包含有:私有 final 字段的非空改进、新的 interop 改进、对 DevTools 中的扩展支持、以及对 Web 路线图的更新,包括对 Was…

Unity开发之C#基础-集合(字典)(Dictionary)

前言 Hello 兄弟们 一转眼俩月又过去了(失踪人口回归) 不出意外的是出意外了 失踪了两个月 有点对不起我这为数不多的粉丝们 实不相瞒忙的焦头烂额 也没心情写博客 实在对不住各位 好了长话短说 今天这篇文章是讲解c#当中的新的一种集合的表现&#xff…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers(通常简称为protobuf)是Google公司开发的一种数据描述语言,它能够将结构化数据序列化,可用于数据存储、通信协议…

pip 问题

升级pip命令: python -m pip install --upgrade pippip不能下载pytorch: 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有,pip不会进行本地文件夹搜索。

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层,目前已有三层投入使用,分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房,其 他各楼层均有一个小房间放置网络设备。 第一步 询…

程序员如何悄悄拔尖,然后惊艳四座?

谁最初还不是个血气方刚、胸怀抱负的有志青年了? 渐渐的,被岁月磨平棱角,被生活冲淡理想,如今的你还有几分似从前? 你是否,不安现状、焦虑未来、忙忙碌碌没有方向? 不甘平庸?不想摸鱼&#…

【LeetCode刷题-滑动窗口】--1004.最大连续1的个数III

1004.最大连续1的个数III 方法&#xff1a;滑动窗口 class Solution {public int longestOnes(int[] nums, int k) {int left 0,right 0,zero 0,res 0;while(right < nums.length){if(nums[right]0){zero;}while(zero > k){if(nums[left] 0){zero--;}left;}res Ma…

深度系统(Deepin)开机无法登录,提示等待一千五百分钟

深度系统&#xff08;Deepin&#xff09;20.0&#xff0c; 某次开机无法登录&#xff0c;提示等待一千五百分钟。 &#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 用电脑这么多年&#xff0c;头一回遇到这种…

大数据Doris(二十四):数据导入(Stream Load)介绍

文章目录 数据导入(Stream Load)介绍 一、适用场景 二、基本原理

AE 的软件、硬件、驱动控制、调试策略(没有算法)

#灵感# AE是个值得推敲再推敲的模块&#xff0c;有意思。 目录 相关的硬件-光圈&#xff1a; 相关的软件-曝光-ISO&#xff1a; ISP中的sensor AE 组成&#xff1a; sensor AE的流程及控制&#xff1a; tuning时AE的一些策略&#xff1a; 相关的硬件-光圈&#xff1a; 光…

低代码平台排名及评析一览:谁是最具潜力的Top5?

在数字化时代&#xff0c;低代码平台已经逐渐成为企业快速开发应用的首选工具。众多低代码平台涌现市场&#xff0c;但谁才是最具潜力的Top 5呢&#xff1f;本文将为您揭示并评析这些领先的平台。 云表平台&#xff1a;能开发复杂管理系统的企业级低代码平台 一、平台背景 云表…

Spring Cloud Netflix微服务组件-Hystrix

目录 Hystrix的主要功能 传统容错手段 超时机制 应用容错三板斧 超时机制 舱壁隔离 熔断降级 侵入式Command用法 改进版一&#xff1a;ribbon与hystrix组合 改进版二&#xff1a;feign与hystrix组合 Hystrix三态转换图 源码分析 流程图 核心逻辑流程图 核心实现…

ICCV 23丨3D-VisTA:用于 3D 视觉和文本对齐的预训练Transformer

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2308.04352 开源代码&#xff1a;http://3d-vista.github.io 摘要&#xff1a; 3D视觉语言标定&#xff08;3D-VL&#xff09;是一个新兴领域&#xff0c;旨在将…

【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅

欢迎来到 JQuery 的奇妙世界&#xff0c;一个充满活力和灵感的地方。在这个世界里&#xff0c;我们将一起探讨 JQuery 的遍历功能&#xff0c;这是一个让你轻松发现和操作网页元素的神奇工具。无需太多前端经验&#xff0c;只要有一颗探险的心&#xff0c;你就能在 JQuery 遍历…

一个项目进行测试的一些最基本环境

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0…

分享6个超绝的设计素材网站,绝对好用!

设计师平时都去哪里找素材呢&#xff1f;收藏好这6个网站&#xff0c;绝对能解决你80%的素材需求&#xff0c;话不多说&#xff0c;直接上干货。 设计素材 1、菜鸟图库 https://www.sucai999.com/?vNTYxMjky 菜鸟图库是一个非常大的素材库&#xff0c;站内包含设计、办公、自…

差分详解(附加模板和例题)

一、一维差分 1.一维差分运用 设a[N]为原数组,b[N]为差分数组&#xff0c;c[N]为进行操作后得到的新数组 (1).先求出差分数组b[N] for(i1;i<n;i) {cin>>a[i];b[i]a[i]-a[i-1]; } (2).进行差分操作&#xff0c;利用void insert(int l,int r,int c)函数 void ins…

MathType2024最新word公式编辑器

使用word进行论文编写时&#xff0c;常需要使用公式编辑器&#xff0c;但有些word中并没有公式编辑器&#xff0c;这时应该怎么办呢&#xff1f;本文将围绕word里没有公式编辑器怎么办&#xff0c;word中的公式编辑器怎么用的内容进行介绍。 一、word里没有公式编辑器怎么办 …