广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >浅析Node.js 中 Stream API 的使用
  • 134
分享到

浅析Node.js 中 Stream API 的使用

jsNodeAPI 2022-06-04 17:06:32 134人浏览 独家记忆
摘要

本文由浅入深给大家介绍node.js stream api,具体详情请看下文吧。 基本介绍 在 node.js 中,读取文件的方式有两种,一种是用 fs.readFile ,另外一种是利用 fs.creat

本文由浅入深给大家介绍node.js stream api,具体详情请看下文吧。

基本介绍

node.js 中,读取文件的方式有两种,一种是用 fs.readFile ,另外一种是利用 fs.createReadStream 来读取。

fs.readFile 对于每个 Node.js 使用者来说最熟悉不过了,简单易懂,很好上手。但它的缺点是会先将数据全部读入内存,一旦遇到大文件的时候,这种方式读取的效率就非常低下了。

而 fs.createReadStream 则是通过 Stream 来读取数据,它会把文件(数据)分割成小块,然后触发一些特定的事件,我们可以监听这些事件,编写特定的处理函数。这种方式相对上面来说,并不好上手,但它效率非常高。

事实上, Stream 在 Node.js 中并非仅仅用在文件处理上,其他地方也可以看到它的身影,如 process.stdin/stdout , Http , tcp Sockets , zlib , crypto 等都有用到。

本文是我学习 Node.js 中的 Stream API 中的一点总结,希望对大家有用。

特点

基于事件通讯

可以通过 pipe 来连接流

种类

Readable Stream 可读数据流

Writeable Stream 可写数据流

Duplex Stream 双向数据流,可以同时读和写

TransfORM Stream 转换数据流,可读可写,同时可以转换(处理)数据

事件

可读数据流的事件

readable 数据向外流时触发

data 对于那些没有显式暂停的数据流,添加data事件监听函数,会将数据流切换到流动态,尽快向外提供数据

end 读取完数据时触发。注意不能和 writeableStream.end() 混淆,writeableStream 并没有 end 事件,只有 .end() 方法

close 数据源关闭时触发

error 读取数据发生错误时触发

可写数据流的事件

drain writable.write(chunk) 返回 false 之后,缓存全部写入完成,可以重新写入时就会触发

finish 调用 .end 方法时,所有缓存的数据释放后触发,类似于可读数据流中的 end 事件,表示写入过程结束

pipe 作为 pipe 目标时触发

unpipe 作为 unpipe 目标时触发

error 写入数据发生错误时触发

状态

可读数据流有两种状态: 流动态 和 暂停态 ,改变数据流状态的方法如下:

暂停态 -> 流动态

添加 data 事件的监听函数

调用 resume 方法

调用 pipe 方法

注意:如果转为流动态时,没有 data 事件的监听函数,也没有 pipe 方法的目的地,那么数据将遗失。

流动态 -> 暂停态

不存在 pipe 方法的目的地时,调用 pause 方法

存在 pipe 方法的目的地时,移除所有 data 事件的监听函数,并且调用 unpipe 方法,移除所有 pipe 方法的目的地

注意:只移除 data 事件的监听函数,并不会自动引发数据流进入「暂停态」。另外,存在 pipe 方法的目的地时,调用 pause 方法,并不能保证数据流总是处于暂停态,一旦那些目的地发出数据请求,数据流有可能会继续提供数据。

用法

读写文件


var fs = require('fs');
// 新建可读数据流
var rs = fs.createReadStream('./test1.txt');
// 新建可写数据流
var ws = fs.createWriteStream('./test2.txt');
// 监听可读数据流结束事件
rs.on('end', function() {
 console.log('read text1.txt successfully!');
});
// 监听可写数据流结束事件
ws.on('finish', function() {
 console.log('write text2.txt successfully!');
});
// 把可读数据流转换成流动态,流进可写数据流中
rs.pipe(ws);
读取 CSV 文件,并上传数据(我在生产环境中写过)
var fs = require('fs');
var es = require('event-stream');
var csv = require('csv');
var parser = csv.parse();
var transformer = csv.transform(function(record) {
 return record.join(',');
});
var data = fs.createReadStream('./demo.csv');
data
 .pipe(parser)
 .pipe(transformer)
 // 处理前一个 stream 传递过来的数据
 .pipe(es.map(function(data, callback) {
  upload(data, function(err) {
   callback(err);
  });
 }))
 // 相当于监听前一个 stream 的 end 事件
 .pipe(es.wait(function(err, body) {
  process.stdout.write('done!');
 }));

更多用法

可以参考一下 https://GitHub.com/jeresig/node-stream-playground ,进去示例网站之后直接点 add stream 就能看到结果了。

常见坑

用 rs.pipe(ws) 的方式来写文件并不是把 rs 的内容 append 到 ws 后面,而是直接用 rs 的内容覆盖 ws 原有的内容

已结束/关闭的流不能重复使用,必须重新创建数据流

pipe 方法返回的是目标数据流,如 a.pipe(b) 返回的是 b,因此监听事件的时候请注意你监听的对象是否正确

如果你要监听多个数据流,同时你又使用了 pipe 方法来串联数据流的话,你就要写成:

data


.on('end', function() {
 console.log('data end');
})
.pipe(a)
.on('end', function() {
 console.log('a end');
})
.pipe(b)
.on('end', function() {
 console.log('b end');
});

常用类库

event-stream 用起来有函数式编程的感觉,个人比较喜欢

awesome-nodejs#streams 由于其他 stream 库我都没用过,所以有需求的就直接看这里吧

以上内容是小编给大家介绍的Node.js 中 Stream API 的使用,希望大家喜欢。

--结束END--

本文标题: 浅析Node.js 中 Stream API 的使用

本文链接: https://www.lsjlt.com/news/13138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析Node.js 中 Stream API 的使用
    本文由浅入深给大家介绍node.js stream api,具体详情请看下文吧。 基本介绍 在 Node.js 中,读取文件的方式有两种,一种是用 fs.readFile ,另外一种是利用 fs.creat...
    99+
    2022-06-04
    js Node API
  • 浅析Node.js的Stream模块中的Readable对象
    我一直都很不愿意扯 nodejs 的流,因为从第一次看到它我就觉得它的设计实在是太恶心了。但是没办法,Stream 规范尚未普及,而且确实有很多东西都依赖了 nodejs 的流来实现的,所以我也只能捏着鼻子...
    99+
    2022-06-04
    模块 对象 js
  • 浅析Node.js实用的内置API
    目录ProcessOS在构建 Node.js 应用程序时,了解 Node.js 开箱即用的实用程序和 API 有助于满足常见用例和开发需求。 Process:检索有关环境变量、参数、...
    99+
    2022-11-13
  • 深入浅析Node中的Stream(流)
    和上面的示例对比起来,我们发现一个流同时面向生产者和消费者服务的时候我们会选择 Duplex,当只是对数据做一些转换工作的时候我们便会选择使用 Tranform背压问题什么是背压背压问题来源于生产者消费者模式中,消费者处理速度过慢比如说,我...
    99+
    2023-05-14
    前端 Node.js
  • 浅析php中的stream(流)是什么
    PHP Stream 是一种用于读取、写入和操作不同类型数据流的抽象概念。PHP Stream 给 PHP 程序员提供了一种统一的、灵活的方式来处理数据流,包括文件、网络连接、内存等等。通过使用 PHP Stream,开发者可以像处理本地磁...
    99+
    2023-05-14
    php
  • Java8中Stream API操作的示例分析
    这篇文章主要介绍了Java8中Stream API操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.什么是StreamAPI?Java8中有两大最为重要的改变。...
    99+
    2023-06-25
  • node.js中 stream使用教程
    这些日子跑去学了一下OC,但是还没有学成。离转行的时间还有很长,顺便回顾一下node的知识。 每种语言来来去去的人很多,但我就离不开node。我并不是使用它开发,只是使用js相对多一些,因此还是研究node...
    99+
    2022-06-04
    教程 node js
  • Node.js中stream如何使用
    Node.js中stream如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用流的好处举一个读取文件的例子:使用fs.readFi...
    99+
    2022-10-19
  • Node.js中stream模块如何使用
    Node.js中stream模块如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是stream定义流的英文strea...
    99+
    2022-10-19
  • Node.js中流(stream)的使用方法示例
    前言 本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件...
    99+
    2022-06-04
    中流 示例 使用方法
  • Node.js中require的工作原理浅析
    几乎所有的Node.js开发人员可以告诉你`require()`函数做什么,但我们又有多少人真正知道它是如何工作的?我们每天都使用它来加载库和模块,但它的行为,对于我们来说反而是一个谜。 出于好奇,我钻研了...
    99+
    2022-06-04
    工作原理 Node js
  • 浅析Node在构建超媒体API中的作用
    无论是超媒体还是超文本,使用的传输协议都是HTTP,这意味着超媒体可以被所有的浏览器所接受。而描述超媒体的类型我们使用MIME。MIME即Multipurpose Internet Mail Extensi...
    99+
    2022-06-04
    作用 媒体 Node
  • 浅谈Web Storage API的使用
    目录一、浏览器的本地存储技术1.1、sessionStorage1.2、localStorage二、Web Storage相关接口三、浏览器兼容性四、隐身模式五、使用Web Stor...
    99+
    2022-11-12
  • 浅析Node.js中的内存泄漏问题
    这篇文章是由Mozilla的Identity团队带来的 A Node.JS Holiday Season系列文章的首篇,该团队上个月发布了 Persona的第一个测试版本。在开发Persona时我们构建了...
    99+
    2022-06-04
    内存 Node js
  • Pythonyield的使用浅析
    目录如何生成斐波那契數列清单 1. 简单输出斐波那契數列前 N 个数清单 2. 输出斐波那契數列前 N 个数第二版清单 3. 通过 iterable 对象来迭代清单 4. 第三个版本...
    99+
    2022-11-13
  • Android中handler使用浅析
    1. Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,...
    99+
    2022-06-06
    handler Android
  • 浅析Python中signal包的使用
    在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点在程序中可以用定时器实现这种功能,于是就开始摸索了,发现需要一些信号的知识... 查看你...
    99+
    2022-06-04
    Python signal
  • C# AttributeUsage的使用浅析
    AttributeUsage是一个用于指定自定义属性的使用规范的特性类。通过使用AttributeUsage特性,可以限制自定义属性...
    99+
    2023-09-12
    C#
  • 浅析Python WSGI的使用
    目录什么是WSGIWSGI对应用程序规定了什么修改代码写出符合WSGI标准的web业务层总结第一次了解python的WSGI,可能描述的不太准确。 本篇文章所依赖的python环境为...
    99+
    2023-05-17
    Python WSGI使用 Python WSGI
  • 浅析java中asList的使用详解
    asList概述 Java中的asList方法是数组工具类 Arrays中的一个静态方法,Arrays.asList()方法的作用是将数组或一些元素转为集合,asList方法返回值...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作