46 # 可读流 readStream

简介: 46 # 可读流 readStream

上一节实现了文件拷贝功能,其中的读和写的操作都耦合在一起了,能不能实现一个方法,可以用一行搞定,这里涉及到流里的 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---->");
});

目录
相关文章
|
移动开发 小程序
微信小程序web-view嵌入uni-app H5页面,通过H5页面跳转企业微信客户聊天窗口如何操作?
微信小程序web-view嵌入uni-app H5页面,通过H5页面跳转企业微信客户聊天窗口如何操作?
|
12月前
|
人工智能 编解码 搜索推荐
深度测评-主动式智能导购 AI 助手构建的实现与优化
本文深度测评某平台提供的函数计算应用模板,用于快速搭建集成智能导购的电商网站。通过简洁直观的创建与部署流程,用户只需填写API Key等基本信息,即可完成配置。智能导购AI助手能通过多轮对话引导顾客明确需求,精准推荐商品,提升购物体验和转化率。系统支持自定义设置,具备高效、个性化、灵活扩展的特点。未来可引入更多维度推荐、机器学习及语音识别技术,进一步优化导购效果。
762 15
深度测评-主动式智能导购 AI 助手构建的实现与优化
|
机器学习/深度学习 人工智能 算法
基于YOLOv8的火焰烟雾实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
基于YOLOv8的火焰烟雾实时检测系统,使用6744张图片训练有效模型,开发了带GUI界面的系统,支持图片、视频和摄像头实时检测,具备模型权重导入、检测置信度调节等功能,并提供项目完整代码和数据集。
2406 1
基于YOLOv8的火焰烟雾实时检测系统【训练和系统源码+Pyside6+数据集+包运行】
|
算法 API C++
【Cmake MODULE模块库】深度理解CMake中的add_library: MODULE的全面指南
【Cmake MODULE模块库】深度理解CMake中的add_library: MODULE的全面指南
747 0
|
Go
Go语言切片深入解析:按值传递的奥秘
【10月更文挑战第27天】
175 0
|
机器学习/深度学习 算法 测试技术
【博士每天一篇文献-算法】A Simple Way to Initialize Recurrent Networks of Rectified Linear Units
本文介绍了一种新的递归神经网络(RNN)初始化方法,通过使用单位矩阵或其缩放版本来初始化修正线性单元(ReLU)组成的RNN,称为IRNN,该方法在处理长期依赖任务时表现优异,与长短期记忆(LSTM)RNN性能相当。
181 1
|
运维 监控 API
探索微服务架构:从理论到实践
【7月更文挑战第16天】本文旨在深入探讨微服务架构的核心概念、设计原则以及在实际应用中所面临的挑战与解决策略。通过对微服务的定义和优势进行阐述,分析其在现代软件开发中的重要性,并结合具体案例,展示如何将微服务理念应用于实际项目中,以提升系统的可维护性、可扩展性和敏捷性。
165 6
|
SQL 关系型数据库 MySQL
MySQL调优之show profile 应用
MySQL调优之show profile 应用
427 0
|
Java 数据库连接 开发者
从零到一:JAVA反射技术的“逆袭”之路
【7月更文挑战第1天】Java反射技术,从高级特性走向普及,核心是Class类,用于运行时检查和操作类信息。在Spring等框架中,反射实现DI和AOP,提升灵活性。动态代理通过Proxy和InvocationHandler实现方法拦截。反射现已成为Java不可或缺的工具,未来潜力无限。
91 0