Node.js 中的 stream 对象的理解及用法详解

简介

在 Node.js 中,stream 是一种处理流数据的 API。它允许我们从文件、网络等来源读取数据,或者将数据写入到文件、网络等位置。stream 是 Node.js 异常常用的模块之一,应用场景也非常广泛,例如处理大型文件、实现 HTTP 流传输等。

本文将详细讲解 Node.js 中 stream 对象的理解及用法,并通过示例代码帮助读者将所学知识实践应用。

理解

对 stream 的理解,可以从两方面入手:stream 对象的属性和 stream 对象的事件。

属性

每个 stream 对象在创建时都有一组属性,这些属性可以控制 stream 对象的行为。最常用的属性有以下三种:

  • highWaterMark:控制每次从 stream 中读入多少字节的数据,默认值为 64 KB。修改它的值可以增加或减少每个读入的块的大小。
  • encoding:用于流排除数据的编码方式,默认为 null。如果设置了 encoding 属性,则 stream 将会自动将读取的数据转换成指定的编码方式。常见的编码方式有 'utf8'、'utf16le'、'ascii'、'base64'、'binary' 等。
  • objectMode:控制 stream 传输的数据是否是普通的字节块。如果设置为 true,则可以像操作数组一样操作 stream。

除了上述三种属性,stream 还有包括 readablewritablepauseddestroyed 等在内的其他属性,读者可以查看 Node.js 文档获取更多信息。

事件

stream 对象的行为除了由属性外,还可以通过事件来控制。stream 对象可以发出以下事件:

  • readable:当 stream 有数据可供消费时,会触发该事件。该事件表示数据可以开始读取了。
  • data:每次从 stream 中读取到一块数据时,该事件就会触发,回调函数的参数通常是读取到的数据块。
  • end:当 stream 中数据读完时触发该事件,表示读取完成。
  • error:当 stream 发生错误时,会触发该事件。回调函数的参数通常是一个 Error 对象。
  • close:当 stream 被关闭时,会触发该事件。

除了上述事件,stream 还有包括 drainfinishpipe 等在内的其他事件,读者可以查看 Node.js 文档获取更多信息。

用法

stream 的用法可以分为读取和写入两种。

读取

读取 stream 可以通过 createReadStream 函数来实现。该函数第一个参数是文件路径,第二个参数是一个可选的 options 对象,可以设置一些读取 stream 的属性。读取 stream 可以通过 on 函数绑定上述事件来控制其读取行为。

下面是一个读取文件的示例代码:

----- -- - --------------

----- -------------- - ---------------------------------- - -------------- --- --------- ------ ---
----------------------------- -- -- -
  --- ------
  ----- ------- - ---------------------- -- ----- -
    ------------------- -- --------
  -
---

------------------------ -- -- -
  -------------------------
---

fs.createReadStream 创建了一个读取 example.txt 文件的 stream 对象,highWaterMark 属性设置为 24,即读取数据块的大小为 24 字节。同时,设置 encoding 为 'utf8' 表示读取内容应该为 utf8 编码。绑定 readable 事件,当 stream 有数据可供读取时,进入循环,不断地读取数据块并输出它们,直到所有数据块都读取完毕。

写入

写入 stream 可以通过 createWriteStream 函数来实现。该函数第一个参数是文件路径,第二个参数是一个可选的 options 对象,可以设置一些写入 stream 的属性。写入 stream 可以通过 write 函数写入数据,通过 end 函数结束数据写入。

下面是一个写入文件的示例代码:

----- -- - --------------

----- -------------- - -----------------------------------

------------------------------
---------------------- ---
------------------------------
------------------------

fs.createWriteStream 创建了一个写入 output.txt 文件的 stream 对象。通过调用 write 函数写入数据,将字符串 'hello'、' '、'world' 分别写入文件中。最后通过调用 end 函数结束数据的写入,并写入字符串 '!'。

总结

stream 是 Node.js 中非常重要的模块之一,可以用于处理大型文件、实现 HTTP 流传输等应用场景。掌握 stream 对象的属性和事件以及读写 stream 的方法是开发高效、健壮 Node.js 应用的基础。本文对 stream 对象的理解及用法进行了详细的讲解,并提供了相应的示例代码,希望读者能够通过实践运用所学知识。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6480719648841e9894fe5c54


猜你喜欢

  • 如何使用响应式框架构建响应式设计

    在网络和设备的多样化时代,响应式设计已经成为了网站开发的标配。而响应式框架则是将响应式设计落地的重要工具。本文将介绍如何使用响应式框架构建响应式设计,主要包括以下两个方面: 响应式框架的选择 响应...

    1 年前
  • 如何在 PWA 中实现客户端存储和快速访问

    PWA(Progressive Web Apps)是一种新兴的 WEB 应用程序,它运行于浏览器中,并具有类似于原生应用程序的体验。PWA 具有离线访问、推送通知和快速加载等功能,这让 Web 应用变...

    1 年前
  • 如何正确使用 Web Components 进行跨框架和跨语言的组件开发

    随着前端技术的发展,Web Components 已经成为了一种非常重要的前端开发技术。它可以让开发者们更加轻松地创建和维护跨框架和跨语言的组件,同时提高代码复用和可维护性。

    1 年前
  • TypeScript 中箭头函数的最佳实践

    TypeScript 里的箭头函数是一个非常实用的特性,可以方便地创建一个匿名函数。它可以减少代码的复杂度,增强可读性和可维护性。然而,如果不采用最佳实践,使用箭头函数可能会带来一些意外的问题。

    1 年前
  • Angular Material 侧边栏的使用

    简介 Angular Material 是 Angular 框架的一个 UI 库,提供了一些常用的组件和样式用于开发 Web 应用程序。其中,侧边栏是一个常见的布局组件,被广泛应用于网站和应用程序的设...

    1 年前
  • ## 详解 ES6 中新增的三个循环语句: for...in, for...of, and forEach

    详解 ES6 中新增的三个循环语句: for...in, for...of, and forEach 在 ES6 中,新增了三种循环语句:for...in、for...of 和 forEach。

    1 年前
  • 解决 Promise 在低版本浏览器下的兼容性问题

    Promise 是 ES6 中的一项新特性,它可以很好地解决异步编程的问题。然而,在低版本浏览器中,并不支持 Promise,因此在开发过程中需要对其进行兼容性处理。

    1 年前
  • Sequelize 之使用 npm 包 sequelize-fixtures 实现数据批量导入

    在开发 Web 应用的过程中,我们通常需要向数据库中导入数据,以便于测试和运行。但是手动插入数据既费时也易错,因此有必要学会如何使用 npm 包 sequelize-fixtures 来实现数据的批量...

    1 年前
  • NUXT SSR 到 Serverless 全站部署

    NUXT SSR 到 Serverless 全站部署 随着云计算技术的不断发展,Serverless 架构开始成为互联网应用的新趋势。相比传统的后端部署方式,Serverless 架构不仅可以将成本和...

    1 年前
  • ES10 中的新特性 Array 增加了多个方法,包括 flat、flatMap、reduce 等

    ES10 中的新特性 - Array 增加了多个方法 在前端开发领域中,数组是最常用的数据结构之一,而 ES10 中引入的一些新的数组方法,如 flat、flatMap、reduce 等,可大大提高数...

    1 年前
  • Express.js + Angular.js 实现 MVVM 开发

    Express.js + Angular.js 实现 MVVM 开发 前言 在前端开发中,MVVM 架构模式已经成为了一种非常流行的模式。MVVM 代表着 Model-View-ViewModel 模...

    1 年前
  • Docker 镜像加速器配置与使用教程

    Docker 镜像加速器是一个能够加快 Docker 镜像下载速度的工具。由于 Docker 镜像在下载的过程中,需要从(一般是) Docker Hub 下载,而在国内,由于众所周知的原因,国际网络的...

    1 年前
  • 在 GraphQL 服务中使用 Dataloader 以加速你的数据

    GraphQL 是一种强大的 API 技术,它允许客户端根据自己的需求精确获取数据。但是,在实际开发中,我们可能会遇到一些性能问题,尤其是在获取大量连续的数据时。这个时候,我们可以使用 Dataloa...

    1 年前
  • 使用 React-Router 构建 SPA 应用中如何优雅地处理路由变化?

    在前端开发中,单页面应用(Single Page Application, SPA)已经成为常见的开发方式。而使用 React-Router 可以更好地管理 SPA 应用中的路由。

    1 年前
  • Extendable Methods 解决继承问题

    在前端开发中,继承是一种常见的编程技术,用于子类派生自父类并继承其属性和方法。然而,当需要为子类添加新的方法时,通常需要在子类中重写整个方法,这会带来一些问题:代码冗余、维护困难等。

    1 年前
  • Fastify 框架中异步文件读写的实现方式

    Fastify 是一个高效、快速、简单且低开销的 Node.js Web 框架,它的设计目标是优秀的开发者体验和性能,它在实现性能优化方面表现尤为出色。在 Fastify 中,异步文件读写操作是实现性...

    1 年前
  • Webpack 优化:提取动态 import() 的公共依赖

    在前端开发中,我们经常使用 Webpack 进行项目的打包和优化。在这个过程中,我们可能会遇到一个问题,就是当我们使用动态加载(dynamic import)时,会出现重复加载同样的依赖库,导致浪费网...

    1 年前
  • ES7 中的 Array 方法:Array.prototype.copyWithin 的详解及应用实例

    在ES7标准中提供了一种新的数组方法:Array.prototype.copyWithin 。本文将对这个方法的定义、用法、示例等做详细介绍,希望能对前端开发者有所帮助。

    1 年前
  • Jest 测试时如何 mock setTimeout/setInterval?

    在前端开发中,我们经常需要使用 setTimeout 和setInterval 待定时器来执行一些异步操作,但当进行单元测试时, 这样的异步操作会导致测试的不确定性,因为测试的结果取决于待定时器何时被...

    1 年前
  • 无障碍导航栏设计:如何为屏幕阅读器用户提供更好的使用体验?

    前言 在前端开发中,我们经常会遇到需要设计导航栏的情况,这对于一般用户来说非常方便易用。但是,对于一些使用屏幕阅读器的用户,导航栏可能会成为一道障碍。 在这篇文章中,我们将深入探讨无障碍导航栏的设计,...

    1 年前

相关推荐

    暂无文章