【Node.js】流

概念

流(Stream)是一种用于在节点(Node)之间传输数据的抽象概念。

它可以看作是一种连续的数据流,数据可以按照连续的块(chunk)通过流从源(source)流向目的地(destination)。流可以是可读的(Readable)或可写的(Writable),也可以是可读写的(Duplex)。

Node.js 提供了 stream 模块,它包含了用于创建、处理和管理流的各种类和方法。

当然,在浏览器端,HTML5 提供了一些原生的流处理能力,如 ReadableStream 和 WritableStream。这些浏览器 API 允许通过网络请求获取数据的流式传输,而不是一次性获取整个响应。另外,浏览器端还可以使用 Blob 对象来处理文件流。

  1. 可读流(Readable Stream):可读流用于从数据源中读取数据。例如,可以使用可读流从文件系统中读取文件、从网络中接收数据、从标准输入读取用户输入等。可读流的常见用法包括使用 fs.createReadStream() 创建文件读取流、使用 http.IncomingMessage 对象获取 HTTP 请求的可读流。

  2. 可写流(Writable Stream):可写流用于将数据写入目的地。例如,可以使用可写流将数据写入文件、将数据发送到网络、将数据输出到标准输出等。可写流的常见用法包括使用 fs.createWriteStream() 创建文件写入流、使用 http.ServerResponse 对象发送 HTTP 响应的可写流。

  3. 双工流(Duplex Stream):双工流实现了同时可读可写的功能。它可以同时处理输入和输出流。例如,可以使用双工流处理网络通信中的数据读取和写入。

  4. 转换流(Transform Stream):转换流是一种特殊的双工流,它可以对流中的数据进行转换。例如,可以使用转换流进行数据压缩、加密、解密、格式转换等操作。常见的转换流包括 zlib.createGzip() 创建用于数据压缩的流、crypto.createCipher() 创建用于数据加密的流等。

具体用法

  1. 数据转换:流可以用于在数据传输的过程中进行转换操作。通过使用转换流(Transform Stream),我们可以对流中的数据进行处理、转换和过滤。常见的转换操作包括数据压缩(使用 zlib.createGzip() 创建压缩流)、数据加密(使用 crypto.createCipher() 创建加密流)等。

例如,以下示例将一个文本文件压缩并保存成新的文件:

const fs = require('fs');
const zlib = require('zlib');const readableStream = fs.createReadStream('input.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('output.txt.gz');readableStream.pipe(gzipStream).pipe(writableStream);

在这个示例中,通过将可读流连接到压缩流,然后再连接到可写流,实现了从输入文件到输出压缩文件的流转换。

  1. 大文件处理:使用流可以有效地处理大文件,而不需要将整个文件加载到内存中。通过将文件读取流连接到文件写入流,可以逐块地将大文件从源复制到目标地。

例如,以下示例将一个大文件复制到新的文件:

const fs = require('fs');const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');readableStream.pipe(writableStream);

这段代码使用可读流从 input.txt 文件中读取数据,并使用可写流将数据写入 output.txt 文件中。通过使用流,大文件可以逐块地处理,减少了内存占用。

  1. 网络通信:流在网络通信中也经常被使用。在服务器端,可以使用可读流读取请求数据,同时通过可写流向客户端发送响应数据。在客户端,同样可以使用可读流读取服务器响应数据,通过可写流将请求数据发送到服务器。

例如,以下示例使用 Node.js 的 http 模块创建一个简单的 Web 服务器,并将接收到的请求数据作为响应返回给客户端:

const http = require('http');const server = http.createServer((req, res) => {req.setEncoding('utf-8');req.on('data', (chunk) => {console.log(`Received data: ${chunk}`);});res.write('Hello, World!');res.end();
});server.listen(8080, () => {console.log('Server is listening on port 8080');
});

在这个示例中,当客户端发送请求时,服务器会将请求的数据作为流式数据接收。在 data 事件处理程序中,我们可以对接收到的数据进行处理。同时,服务器使用 write() 方法将响应数据写入可写流,最后使用 end() 方法结束响应。

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

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

相关文章

LeetCode Hot100-哈希-两数之和

题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可…

蓝桥杯 完全二叉树的权值

Problem: 蓝桥杯 完全二叉树的权值 文章目录 思路解题方法前缀和双指针 复杂度前缀和Code双指针Code 思路 这个问题是关于完全二叉树的权值。完全二叉树的特性是,除了最后一层外,其他各层的节点数都达到最大,且最后一层从左向右连续。在这个问…

数据分析-Pandas类别数据序列合并

数据分析-Pandas类别数据序列合并 数据分析和处理中,难免会遇到各种数据,那么数据呈现怎样的规律呢?不管金融数据,风控数据,营销数据等等,莫不如此。如何通过图示展示数据的规律? 数据表&…

双进程交互实现App自动重启

背景 你可能会好奇,有些手游(比如王者荣耀)是怎么实现资源更新后自动重启的? 这个体验确实不错,因为不需要用户手动点击桌面图标重启App,在一些数据恢复备份的场景中,很实用。比如&#xff0c…

代码随想录算法训练营第二十天| 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

题目与题解 654.最大二叉树 题目链接:654.最大二叉树 代码随想录题解:654.最大二叉树 视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili 解题思路: 构造最大二…

数据库及中表的创建和管理

目录 创建数据库 使用数据库(使用,查看信息) 修改数据库(删除,修改)

promethus的安装使用

1、# 软件下载地址 https://prometheus.io/download/ https://grafana.com/grafana/download https://prometheus.io/download/ Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。 Prometheus 的优点 1、非常少的外部依赖,安装…

OceanBase4.2.2.1 单机集群在ArmX86安装(自测记录)

OceanBase OceanBase就不必多加介绍了,本次主要是分享对于它的安装使用,先说说背景,首先接触是因为信创国产化的要求,为满足支持国产化,安装了Arm架构下版本4.0.0,满足支持通过。后来项目实际使用&#xff…

由浅到深认识Java语言(20):包装类

该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…

JavaScript中实现数组去重

在JavaScript中实现数组去重是一个常见的问题,下面是一个使用不同方法实现数组去重的示例代码: 方法一:使用Set对象 javascript function uniqueArray(arr) { return [...new Set(arr)]; } const arr [1, 2, 3, 3, 4, 5, 5, 6]; cons…

leetcode刷题日记-外观数组

题目描述 解题思路 初始化字符串 init 为 “1”,作为外观数列的第一项。 通过循环迭代生成外观数列的下一项,循环次数为 n-1,因为已经初始化了第一项。 在每次迭代中,通过两个指针 pos 和 start 来遍历当前项 init,po…

C++中的枚举类型

C中的enum(枚举)类型是一种用户定义的类型,用于表示一组整数值,每个值都有对应的名称,增强了代码的可读性和可维护性。 1. 基本枚举类型 基本的枚举类型定义了一组命名的整数常量。 enum Color {RED,GREEN,BLUE };C…

创业之路:探索如何在Facebook上创业成功

引言 在当今数字化时代,社交媒体已成为创业者们开展业务、建立品牌和推广产品的重要平台之一。作为全球最大的社交媒体平台之一,Facebook为创业者提供了丰富的机会和资源。本文将探讨如何在Facebook上创业成功的关键因素和实践方法,帮助创业…

Spring Cloud: openFegin

文章目录 一、什么是openFegin 一、什么是openFegin Spring Cloud OpenFeign 是一个声明式的 Web Service 客户端,它使得编写 Web Service 客户端变得更加简单。OpenFeign 整合了 Ribbon 和 Hystrix,提供了负载均衡和容错机制。同时,OpenFei…

语 句 篇

文章目录 1. if 语句2. for 循环3. while 循环 1. if 语句 if 语句用于基于某个条件执行代码。如果条件为真(True),则执行相应的代码块;如果条件为假(False),则跳过该代码块。 基本语法&#…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-第几个幸运数字

幸运数字是可以被3,5,7任一整除的数字&#xff0c;列举小明号码内的所有可能组合并计数。注意别忘了把1占的一位减去。 #include<stdio.h> typedef long long ll; int main(){long long ans 0, n 59084709587505LL;for(ll i 1; i < n; i * 3){//计算小于等于n的数…

关于MySQL查询JSON的语法糖

1. 根据单JSON对象查询 select count(1) from report_configuration r where json_extract(r.report_configuration,$.dataSetName) :dataSetName 2.纯数组JSON查询 one代表就遇到第一个就返回 固定写法 SELECT count(1) FROM statistics_property where data_set_name …

AI程序员的诞生会对程序员有多大影响?

近期&#xff0c;全球首位AI程序员Devin的出场&#xff0c;不禁让我想到了一个有趣的问题&#xff1a;AI程序员会不会抢程序员的饭碗呢&#xff1f;先别着急下结论&#xff01;虽然AI技术在编程领域越来越广泛&#xff0c;但它真的能完全替代我们程序员吗&#xff1f; 目前的AI…

不愧是淘天,全方位八股拷打

恭喜发现宝藏&#xff01;搜索公众号【TechGuide】回复公司名&#xff0c;解锁更多新鲜好文和互联网大厂的笔经面经&#xff0c;目前已更新至美团、微软… 作者TechGuide【全网同名】 基本情况 投递岗位&#xff1a;后台开发 投递部门&#xff1a;阿里淘天 招聘类型&#xf…

数据结构中排序算法

介绍 排序算法是计算机科学中的一类算法&#xff0c;用于对元素序列进行排序&#xff0c;以便按照某种特定的顺序&#xff08;如升序或降序&#xff09;组织数据。这些算法在软件开发和数据处理中扮演着至关重要的角色&#xff0c;因为它们可以提高搜索效率、优化数据结构的访…