nodejs流

什么是流 stream

流是用于在 Node.js 中处理流数据的抽象接口。 node:stream 模块提供了用于实现流接口的 API。

什么是流数据

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

Nodejs 中的流(Stream)是用来比喻数据传输的一种形式,数据传输的起点就是流的源头,数据传输的终点就是流的终点。

例子

例如在网页发起一个 HTTP 请求,浏览器就是流的源头,服务器就是流的终点。等服务器处理完请求,返回响应时,服务器就变成了流的源头,浏览器变成了流的终点。

计算机中的流传输的是数据(字节)

流的本质

它能够发送/接受数据,本质就是让数据流动起来,如下图:

流可以分成三部分:

  • source
  • dest
  • pipe

sourcedest之间有一个连接的管道pipe,它的基本语法是source.pipe(dest)sourcedest就是通过pipe连接,让数据从source流向了dest如下图所示:

为什么用stream

根据输出结果 说明stream是分块读入内存的

const fs = require('fs');const readStream = fs.createReadStream('testA.file');
const writeStream = fs.createWriteStream('output.file');readStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);/*Received 65536 bytes of data.Received 65536 bytes of data.Received 65536 bytes of data.Received 65536 bytes of data.Received 65536 bytes of data.Received 22320 bytes of data.65536*5+22320=350,000说明流是分块读文件的*/writeStream.write(chunk);
});readStream.on('end', () => {// console.log('File reading is finished.');writeStream.end();
});

如果读取小文件,我们可以使用fs读取,fs读取文件的时候,是将文件一次性读取到本地内存

const fs = require('fs');
// const path = require('path');
const options = {encoding: 'utf-8',flag: 'r'
}fs.readFile('./testA.file', options, (err, data) => { //fs模块中的readFile方法可以接收3个参数,分别为:文件路径、配置对象、回调函数。if (err) {console.log(err); //readFile一次性读取//只打印一次Received 350000 bytes of data.}console.log(`Received ${data.length} bytes of data.`);
}) 

上文的readFile和writeFile实际上是对整个文件进行读取和写入,对硬件资源消耗较大。在webserver中这种情况是不被允许的。

stream作为一种“源源不断”的数据传递方式,有效节省了硬件开销

流的类型

Node.js 中有四种基本的流类型:

可写流:可写入数据的流。例如 fs.createWriteStream() 可以使用流将数据写入文件
可读流: 可读取数据的流。例如fs.createReadStream() 可以从文件读取内容
双工流: 既可读又可写的流。例如 net.Socket
转换流: 可以在数据写入和读取时修改或转换数据的流。例如,在文件压缩操作中,可以向文件写入压缩数据,并从文件中读取解压数据

怎么用?

fs.createReadStream(filePathA);//创建读取流

fs.createWriteStream(filePathB)//创建写入流

readStream.pipe(writeStream) // 通过pipe链接读取流和写入流

结果:

读取流与写入流之间通过pipe(管道)进行连接,数据源源不断地从读取流传递到写入流。

textA.txt

1234

textB.txt 由空到有值

1234

const fs = require('fs')
const path = require('path')// 分别获取两个文件的路径
const filePathA ='./testA.txt';
const filePathB = './testB.txt';// 创建读取流和写入流
const readStream = fs.createReadStream(filePathA);//创建读取流
const writeStream = fs.createWriteStream(filePathB)//创建写入流// 通过pipe链接读取流和写入流
readStream.pipe(writeStream) //效果是读取filePathA信息,写入到filePathB// 读取流监听'end'事件,输出完成信息
readStream.on('end', () => {console.log('copy done!');
}) 
//读取流与写入流之间通过pipe(管道)进行连接,数据源源不断地从读取流传递到写入流。

好处

当我们使用Node.js的流进行文件读取时,数据会被分成一块块的读入内存,而不是一次性将整个文件读入内存。这样可以避免因为文件过大而导致内存溢出的问题。同样,在使用流进行网络传输时,也可以将数据分成一块块进行传输,从而提高传输效率。

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

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

相关文章

外包实在是太坑了,划水三年,感觉人都废了

先说一下自己的情况,专科生,19年通过校招进入杭州某个外包软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了3年的功…

Python绘制几种常见的时序分析图

时间序列数据是一种按照时间顺序排列的观测值集合,每个观测值对应于一个特定的时间点。这种数据在许多领域中都具有重要的应用价值,如金融、经济、气候科学等。通过分析时间序列数据,可以帮助我们掌握潜在的模式、发现趋势和季节性波动等重要…

数据可视化在电商中的威力:改变经营的新趋势

随着电商行业的迅速发展,数据可视化在电商经营中扮演着越来越重要的角色。我接手的许多可视化大屏设计工作都来自于各类电商店铺,今天让我们一起来看看数据可视化是如何改变电商经营的。 首先,通过数据可视化可以更好地洞察消费者行为。通过…

网络编程基础api

1. IP 协议 1.1 IP 分片 (1)IP 分片和重组主要依靠 IP 头部三个字段:数据报标识、标志和片偏移 以太网帧的 MTU 是 1500 字节; 一个每个分片都有自己的 IP 头部,它们都具有相同的标识值,有不同的片偏移…

Python与ArcGIS系列(十六)重复节点检测

目录 0 简述1 实例需求2 arcpy开发脚本0 简述 在处理gis线图层和面图层数据时,有时候会遇到这种情况:数据存在重复节点或伪重复节点(两个节点距离极小),往往我们需要对这种数据进行检测标注或进行修改。本篇将介绍如何利用arcpy及arcgis的工具箱实现这个功能。 1 实例需求…

Java-网络通信总结

文章目录 网络程序设计基础局域网与互联网 网络协议IP协议TCP/IP 协议端口域套接字 TCP 程序InterAddress 类ServerSocket 类 UDP 程序DatagramPacket 类DatagramSocket 类 网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素…

maven工程的pom.xml文件中增加了依赖,但偶尔没有下载到本地仓库

maven工程pom.xml文件中的个别依赖没有下载到本地maven仓库。以前没有遇到这种情况,今天就遇到了这个问题,把解决过程记录下来。 我在eclipse中编辑maven工程的pom.xml文件,增加对mybatis的依赖,但保存文件后,依赖的j…

将输入的字符串反向输出(c语言)

#include<stdio.h> #include<string.h> int main() {int i, j, k;char s[50], temp;gets(s);//输入k strlen(s);//计算字符的长度//反向输出for (i 0, j k - 1;i < k / 2;i, j--){temp s[i];s[i] s[j];s[j] temp;}puts(s);//输出 }

第二十一章网络程序设计

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmissio…

【S32DS报错】-2-提示Error while launching command:arm-none-eabi-gdb –version错误

目录 1 Error错误提示 2 Error错误原因 3 如何消除Error错误 结尾 【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error错误提示 使用S32DSJ-LinK下载程序&#xff0c;在Dedug Configurati…

uniapp踩坑之项目:使用过滤器将时间格式化为特定格式

利用filters过滤器对数据直接进行格式化&#xff0c;注意&#xff1a;与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为&#xff1a;2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…

数据结构与算法编程题53

简单选择排序 #include <iostream> using namespace std;void sawp(int& a, int& b) {int temp 0;temp a;a b;b temp; }void selection_sort(int array[], int size) {for (int i 0; i < size; i){int min i;for (int j i 1; j < size; j){if (arr…