本文主要是介绍stream流具体介绍 与 流操作—管道pipe,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、stream流具体介绍
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。所有的 Stream 对象都是 EventEmitter 的实例。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)
(1)Stream流的四种流类型:
-
Readable - 可读操作。
-
Writable - 可写操作。
-
Duplex - 可读可写操作.
-
Transform - 操作被写入数据,然后读出结果。
(2)Stream流的事件
1》data事件
从可读流中读取新数据时触发。data数据作为事件处理程序的第一个参数。需要注意的是,与其他事件处理程序不同,附加数据侦听器会产生副作用。当连接第一个数据侦听器时,我们的流将被取消暂停。
2》end事件
当可读流中没有数据时触发。
3》finish事件
当可写流结束且所有挂起的写入都已完成时发出。
4》error 事件
在接收和写入过程中发生错误时触发。
5》close事件
通常在流完全关闭时发出,stream不一定会触发事件。
6》puse事件
用于暂停一个可读流。大部分情况我们可以忽略这个方法。
7》resume事件
用于重启一个可读流。
二、流操作—管道pipe
(1)未使用 Stream pipe 情况:
在 Nodejs 中 I/O 操作都是异步的,先用 util 模块的 promisify 方法将 fs.readFile 的 callback 形式转为 Promise 形式,这块代码看似没问题,但是它的体验不是很好,因为它是将数据一次性读入内存再进行的返回,当数据文件很大的时候也是对内存的一种消耗,因此不推荐它。
(2)使用 Stream pipe 情况:
使用stream就可以不需要把文件全部读取了再返回,而是一边读取一边返回,数据通过管道流动给客户端,真的减轻了服务器的压力。
(3)管道pipe的使用
在 Node 应用程序中,可以使用 pipe()
方法将流连接在一起,该方法有两个参数:
- 参数一:作为数据和目标的必需可写流
- 参数二:用于传入选项的可选对象。
如果要将数据从一个文件传输到另一个文件,则使用管道的典型示例。
代码示例:
将我们c.txt里面的内容读取后通过管道pipe写入到e.txt里面:
const fs=require('fs');
// 1.创建可读和可写流
const rs=fs.createReadStream('./data/c.txt');
const ws=fs.createWriteStream('./data/e.txt');
// 2.建立管道
//将我们c.txt里面的内容读取后通过管道写入到e.txt里面
rs.pipe(ws);
这篇关于stream流具体介绍 与 流操作—管道pipe的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!