一文聊聊Node中的stream(流)

什么是流?如何理解流?下面本篇文章就来带大家深入了解一下nodejs中的流(stream),希望对大家有所帮助!

一文聊聊Node中的stream(流)

stream 也就是流,可以理解为一连串的字节像水流那样的存在。按照官方文档的解释:

A stream is an abstract interface for working with streaming data in Node.js.

流是用于在 Node.js 中处理流数据,也就是连续字节的抽象接口。流有 4 种基本类型,本篇文章主要介绍其中两种 —— 可读流和可写流。

可读的(Readable)

我们可以通过 fs.createReadStream() 创建一个可读流 readableStream,第 1 个参数可以是要读取的文件路径,比如现有文件 test.txt 内容为:

hello juejin

登录后复制

第 2 个参数(可选)可以传入一个选项对象,用来控制读取数据的起止位置等: 【相关教程推荐:nodejs视频教程】

const fs = require('fs')const readableStream = fs.createReadStream('./test.txt', {  start: 6,  end: 11})

登录后复制

注意,读取的数据是包括了 start 和 end 的。 在之前介绍 events 模块时说过,所有的流都是 EventEmitter 的实例。所以获取数据是通过监听 ‘data’ 事件:

readableStream.on('data', data => {  console.log(data)  console.log(data.toString())})

登录后复制

打印结果如下,默认是 Buffer 对象,可以通过 toString() 方法转为字符串:

1.png

注意,读取数据时一次最多读取 64 * 1024 字节,如果想改变该数值,可以通过 highWaterMark 选项更改。另外还可以使用 pause() 进行暂停操作,使用 resume() 继续读取:

const readableStream = fs.createReadStream('./test.txt', {  start: 6,  end: 11,  highWaterMark: 2 // 默认为 64 * 1024})readableStream.on('data', data => {  console.log(data)  console.log(data.toString())  readableStream.pause() // 暂停读取  setTimeout(() => {    readableStream.resume() // 恢复读取  }, 2000)})

登录后复制

执行结果如下:

2.gif

除了 ‘data’ 事件,可读流还有其它一些事件,比如监听文件被打开的 ‘open’(回调会被传入 fd 参数),监听文件读取到 end(默认为读取到最后)的 ‘end’,监听文件关闭的 ‘close’(文件读取完会自动关闭):

readableStream.on('data', data => console.log(data))readableStream.on('open', fd => console.log(`${fd}文件打开了`))readableStream.on('end', () => console.log('文件读取到 end 位置了'))readableStream.on('close', () => console.log('文件已关闭'))

登录后复制

打印结果如下:

3.png

可写的(Writable)

使用 fs.createWriteStream() 可以创建可写流,第 1 个参数传入要写入的文件,第 2 个同样是用于配置的可选参数,这里我们将 flags 由表示覆盖写入的 ‘w’ 改为 ‘a’,即追加写入(如果还指定了写入的起始位置 start,则为了兼容 windows 系统, flags 应该写成 ‘r+’):

const writableStream = fs.createWriteStream('test.txt', {  flags: 'a'})writableStream.write('养成', err => console.log(`错误信息:${err}`)) // 错误信息:undefinedwritableStream.write('写作的')writableStream.end('好习惯')

登录后复制

写入数据是通过 write 方法,上方代码执行的结果就是在原本的 “hello juejin” 后添加上了 “养成写作的好习惯”。最后一次写入可以使用 end 方法,这样就能监听到可写流的 ‘close’ 事件了:

writableStream.on('close', () => {  console.log('关闭')})

登录后复制

否则,可写流需要手动 writableStream.close() 关闭才能监听到 ‘close’ 事件。如果写入成功,则作为 write()/end() 的第 2 个参数传入的回调的 err 就为 undefined。

可读流还有另外一些事件,比如文件打开时的 ‘open’ 事件,当 close() 或 end() 被调用后文件写入完成的 ‘finish’ 事件。

可读流与可写流的连接

可读流与可写流可以通过 pipe 方法进行连接,实现对文件的复制:

const readableStream = fs.createReadStream('./test.txt')const writableStream = fs.createWriteStream('./copy.txt')readableStream.pipe(writableStream)

登录后复制

如此,便能将 ./test.txt 内的文本复制到 ./copy.txt 中。

更多node相关知识,请访问:nodejs 教程!

以上就是一文聊聊Node中的stream(流)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2696309.html

(0)
上一篇 2025年3月7日 18:32:02
下一篇 2025年3月6日 14:41:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 聊聊node怎么操作MySQL数据库(增删改查)

    node怎么操作mysql数据库?下面本篇文章带大家了解一下node项目中mysql数据库增删改查的方法,希望对大家有所帮助! 下载安装mysql,检查是否安装成功 net start mysql 登录后复制启动mysql可在桌面右键我的电…

    2025年3月7日 编程技术
    200
  • 通过代码实例带你了解Promise

    本篇文章通过多段代码实例带大家了解 promise 的基础用法,以及更进一步掌握 promise 异步存取的思想。 之前一直有听说 Promise 的威名,但是总觉得是个较为深奥的东西,有点畏难而没能真正地去了解。最近看了李立超老师在B站传…

    2025年3月7日 编程技术
    200
  • 缓存是什么?用node怎么实现?

    浏览器缓存是前端优化的一个重要方向,通过缓存静态资源,可以减少页面的加载时间和减轻服务器负担,提高用户体验。本文将介绍浏览器缓存的基本原理和常见的缓存策略,并用 nodejs的 koa 框架下的代码实现。 缓存原理 浏览器缓存的基本原理是将…

    2025年3月7日
    100
  • 如何升级node版本?详细教程分享

    如何升级node版本?下面本篇文章给大家总结分享详细的升级教程,介绍一下window、mac或linux系统下升级node版本的方法,希望对大家有所帮助! Window 系统 window系统升级node只能到node官网下载window安…

    2025年3月7日
    200
  • 怎么利用Node进行图片压缩

    怎么利用node进行图片压缩?下面本篇文章以png图片为例给大家介绍一下进行图片压缩的方法,希望对大家有所帮助! 最近要搞图像处理服务,其中一个是要实现图片压缩功能。以前前端开发的时候只要利用canvas现成的API处理下就能实现,后端可能…

    2025年3月7日 编程技术
    200
  • 什么是模块化?深析node模块化的那些事

    什么是模块化?本篇文章带大家深度解析node模块化的那些事,希望对大家有所帮助! 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 在上方的定义中未免有一…

    2025年3月7日 编程技术
    200
  • 【整理分享】一些node模块相关的面试题及答案(收藏)

    本篇文章给大家整分享一些关于node模块的面试题,希望帮助你快速了解常见的模块问题的坑点,顺利通过面试。 热更新 如何在不重启 node 进程的情况下热更新一个 js/json 文件? 这个问题本身是否有问题? node.js缓存和热更新密…

    2025年3月7日 编程技术
    200
  • 怎么利用Node搭建Https服务

    怎么利用node搭建https服务?下面本篇文章给大家介绍一下node.js搭建https服务的方法,希望对大家有所帮助! Node.js用于做小程序后台服务,域名要求必须是Https协议。在Node.js开启Http服务是非常简单的,如下…

    2025年3月7日 编程技术
    200
  • node项目中如何使用express来处理文件的上传

    怎么处理文件上传?下面本篇文章给大家介绍一下node项目中如何使用express来处理文件的上传,希望对大家有所帮助! 上传单个文件 我们可以使用 express 官方出品的第三方中间件 multer 来处理,先是安装: npm i mul…

    2025年3月7日 编程技术
    200
  • 一文探讨Node.js项目中怎么使用Koa2集成Swagger

    在本文中,我们将探讨如何在node.js项目中使用koa2集成swagger,以自动生成api文档。我们将介绍swagger的基本概念、相关的npm包,并通过详细的代码示例和解释来演示整个过程。 什么是Swagger Swagger是一款R…

    2025年3月7日
    200

发表回复

登录后才能评论