46 # 可读流 readStream

news2025/4/8 18:12:47

上一节实现了文件拷贝功能,其中的读和写的操作都耦合在一起了,能不能实现一个方法,可以用一行搞定,这里涉及到流里的 pipe

流是有方向的,先读出来再写,node 中实现了流的模块(stream)

文件也想实现流,所以内部文件系统继承了 stream 模块

createReadStream 创建一个可读流(返回一个可读流对象),这个方法默认并不会读取内容:

const fs = require("fs");
const path = require("path");

// createReadStream(path: fs.PathLike, options?: BufferEncoding | ReadStreamOptions | undefined): fs.ReadStream
// 内部的实现原理还是:fs.open  fs.read  fs.close
let rs = fs.createReadStream(path.resolve(__dirname, "./name.txt"), {
    flags: "r", // r 代表读取
    encoding: null, // 默认 null,就是 buffer 类型的
    mode: 0o666, // 模式:可读可写
    autoClose: true, // fs.close
    start: 0, // 0 - 8 包前又包后
    end: 8,
    highWaterMark: 3 // 每次读取的个数
});
console.log(rs);

在这里插入图片描述

为了多个异步方法可以解耦,可以采用发布订阅模式

可读流继承了 events 模块,这里的名字必须要叫 data,源码里写的就是 rs.emit("data"),如果监听了 data,内部会拼命读取文件的内容,触发对应的回调,默认会直到文件读取完毕

下面新建 name.txt 文件,里面添加:

凯小默的博客

在这里插入图片描述

在添加下面的事件监听

const fs = require("fs");
const path = require("path");

let rs = fs.createReadStream(path.resolve(__dirname, "./name.txt"), {
    flags: "r", // r 代表读取
    encoding: null, // 默认 null,就是 buffer 类型的
    mode: 0o666, // 模式:可读可写
    autoClose: true, // fs.close
    start: 0, // 0 - 8 包前又包后
    end: 8,
    highWaterMark: 3 // 每次读取的个数
});

let bufferArr = [];
// 监听 open(文件流特殊的事件,普通流没有)
rs.on("open", (fd) => {
    console.log("open---->", fd);
});
// 监听 data
rs.on("data", (data) => {
    console.log("data---->", data);
    bufferArr.push(data);
    // rs.pause 可以让可读流暂停触发 data 事件
    rs.pause();
    console.log("pause---->暂停");
    // 再次触发 data 事件,可以使用 rs.resume
    setTimeout(() => {
        console.log("过 2s 再次触发 data 事件");
        rs.resume();
    }, 2000);
});
// 监听 end
rs.on("end", () => {
    console.log("end---->", Buffer.concat(bufferArr).toString());
});
// 监听 error
rs.on("error", (err) => {
    console.log("err---->", err);
});
// 监听 close (文件流特殊的事件,普通流没有)
rs.on("close", () => {
    console.log("close---->");
});

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次使用MySQL数据库ORM为 SqlSugar 事务无效的处理过程

在项目中使用了开源代码框架admin.net ,其使用的数据库ORM为SqlSugar 使用以下代码执行事务理论上应该有回滚发生,但数据任然删除了 [UnitOfWork][ApiDescriptionSettings(Name "Delete")] [HttpPost][DisplayName("删除菜单")]p…

linux上搭建nfs服务

NFS(Network File System):它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看&…

测试背了4年“锅“,测试缺陷总结整理(细致)“锅“终丢掉了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 缺陷分析也是测试…

青岛大学_王卓老师【数据结构与算法】Week03_04_线性表的链式表示和实现4_学习笔记

本文是个人笔记,仅用于学习分享,素材来自青岛大学王卓老师的教学视频,如有侵权,请留言作删文处理。 视频链接: 数据结构与算法基础–第3周04–2.5线性表的链式表示和实现4–单链表基本操作2–销毁单链表 &#x1f4…

Echarts X轴文本显示不全 axisLabel设置旋转角度进行展示

option {xAxis: {......axisLabel: {rotate: 45},......},...... };效果:

伦敦金实时行情走势图的魅力

一直以来,伦敦金都因其自由的交易时间和不设涨跌幅限制而充满魅力,它每天的实时行情走势图是全球投资者关注的焦点,任何投资者都可以结合技术和基本面分析手段,来预测未来金价走势,从而在这个市场上实现收益。 虽然在一…

玩游戏感觉很不流畅,无法进入游戏的解决方法

别说3A大作了,有时候觉得玩个小单机游戏感觉很不流畅,甚至进不去游戏,出现这种情况大家就得多关注下自己电脑故障问题了,驱动人生帮大家解决玩游戏不流畅,无法进入游戏的故障问题。 出现玩游戏感觉很不流畅&#xff0…

【C++】C++入门(二)

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 1.缺省参数(默认参数) 2.函数重载 a.函数重载的概念 问题: 为什么C语言无法重载,而C plus plus 可以重载? C plus plus是如何做到函数重载的&a…

【几何数学】【Python】【C++】将线段沿着线段方向延长一定长度,求新的点

p1点和p2点是一条线段的两端,沿着p1指向p2的方向,将线段长度延伸长度x,求延伸后的点ep。如下图: Python代码: import mathdef extend_line_segment(p1, p2, extension_length):"""延伸线段长度并返回…

微信小程序全局数据共享

1.概念 全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。 2.小程序中共享方案 在小程序中,可使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享mobx-miniprogram用来创建Store实例对象 mobx-miniprogram-bindings…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换主干网络之 ConvNext | 《纯卷积结构超越 ViTs》

论文地址:https://arxiv.org/pdf/2201.03545.pdf 代码地址:https://github.com/facebookresearch/ConvNeXt 视觉识别的“Roaring 20年代”始于视觉变换器(ViTs)的引入,它很快取代了ConvNets,成为最先进的图像分类模型。另一方面,普通ViTs在应用于一般的计算机视觉任务(…

日撸java三百行day71-73

文章目录 说明BP神经网络1.基础知识3 代码理解3.1 数据的初始化3.2 训练过程 train方法3.3 forward 前向传播函数3.4 backPropagation反向传播函数 说明 闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客 自己也把手敲的…

【Vue2】Vant2上传文件使用formData方式,base64图片转Blob再转File上传

文章目录 前言一、base64转换为 Blob 对象的方法二、使用步骤1.引入工具类js2.编写formData上传方法3.api方法中的request代码 三、实际操作1.html代码2.js代码 总结 前言 vant2上传组件传送门 使用vant2组件中的uploader组件 <van-uploader v-model"fileList" …

打破常规之路,创新永不停歇!ADSCOPE成功斩获2023第十一届TopDigital“年度最佳营销技术公司”奖项!

2023年6月29日&#xff0c;第十一届TopDigital创新营销奖获奖结果正式揭晓&#xff0c;ADSCOPE凭借先进的广告变现技术&#xff0c;创新的变现理念&#xff0c;从海内外657家参赛企业提交的3052件作品中突出重围&#xff0c;成功斩获“TopDigital创新营销奖—年度最佳营销技术公…

el-table多级表头处理方法,了解lebel和prop的真实含义,template的意义,减少全局定义变量。

Element - The worlds most popular Vue UI framework 官网地址 其原理只需要在 el-table-column 里面嵌套 el-table-column&#xff0c;就可以实现多级表头。 要实现的效果如下图所示&#xff1a; <div class"c-table" id"tablePrint"><el-tabl…

【Java-SpringBoot+Vue+MySql】前后端分离项目云端部署

目录 部署环境&#xff1a; 安装MYSQL&#xff1a; 安装Nginx 安装配置JDK 远程连接数据库 前端打包 后端打包 心得&#xff1a; 部署环境&#xff1a; CentOS7.6 MySQL5.7 JDK1.8 Nginx1.8 下载MySQL MySQL :: Download MySQL Community Server (Archived Versions) …

qt Qss 边框渐变

目录 背景渐变 方案一 Qss 方案二 paintEvent函数 方案三 QGraphicsDropShadowEffect投影效果 背景渐变 QT里面背景是可以渐变&#xff0c;其中qlineargradient里面参数意思 spread&#xff1a;渐变方式&#xff08;具体可以查看qt帮助文档搜索PadSpread&#xff09; 坐…

vue2模拟无限级评论

目录 一、效果展示 二、代码展示 2.1、主页面 2.2、评论父页面组件 2.3、评论多级页面(递归组件) 一、效果展示 二、代码展示 2.1、主页面 <template><div><h1>姓名:{{ $store.state.userInfo1.username }}</h1><button:class"{ aacti…

【加密算法】5 种常见的摘要、加密算法

大家平时的工作中&#xff0c;可能也在很多地方用到了加密、解密&#xff0c;比如&#xff1a; 用户的密码不能明文存储&#xff0c;要存储加密后的密文用户的银行卡号、身份证号之类的敏感数据&#xff0c;需要加密传输还有一些重要接口&#xff0c;比如支付&#xff0c;客户…

数据结构和算法的概念以及时间复杂度空间复杂度详解

⭐️ 什么是数据结构&#xff1f; 百度百科给数据结构的定义&#xff1a; 数据结构(Data Structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构就是数据在内存中的存储方式。 ⭐️ 什么是算法&#xff1f; 百度百…