当前位置: 首页 > news >正文

Nodejs(③Stream)

Transform

就像水管中间加了个 “净水器”,水流过的时候会被处理:

const { Transform } = require('stream');// 想象成一个“过滤器”:只保留数字,过滤掉其他字符
const numberFilter = new Transform({transform(chunk, encoding, callback) {// chunk 是流过来的“一小块数据”(比如用户输入的一段文字)const data = chunk.toString();// 只保留数字const numbersOnly = data.replace(/[^0-9]/g, '');// 把处理后的数据传到下一段“水管”this.push(numbersOnly);callback(); // 告诉系统“这块数据处理完了,可以传下一块了”}
});// 用法:键盘输入(水龙头开)→ 过滤器 → 控制台输出(接水)
process.stdin.pipe(numberFilter).pipe(process.stdout);

测试:运行后在键盘输入 abc123def456,会直接输出 123456(其他字符被过滤了)

pipeline

如果需要多个 “过滤器”(比如先过滤→再加密),用 pipeline 把它们连起来,就像接水管:

const { pipeline } = require('stream/promises');
const fs = require('fs');
const { Transform } = require('stream');// 第一个过滤器:只保留字母
const letterFilter = new Transform({transform(chunk, encoding, callback) {const letters = chunk.toString().replace(/[^a-zA-Z]/g, '');this.push(letters);callback();}
});// 第二个过滤器:转成大写
const upperCaseFilter = new Transform({transform(chunk, encoding, callback) {this.push(chunk.toString().toUpperCase());callback();}
});// 用 pipeline 连接:读文件 → 过滤字母 → 转大写 → 写入新文件
async function run() {await pipeline(fs.createReadStream('input.txt'),  // 读文件(水源)letterFilter,                      // 第一步处理upperCaseFilter,                   // 第二步处理fs.createWriteStream('output.txt') // 写文件(终点));console.log('处理完成!');
}run();

背压控制

你往一个杯子里倒水(生产者),杯子下面有个小洞在漏水(消费者)。

如果倒水速度(生产)比漏水速度(消费)慢,杯子里的水不会满,一切正常。
如果倒水太快,杯子里的水会越积越多(缓冲),快满的时候,你肯定会下意识放慢倒水速度(这就是背压控制在起作用),否则水就会溢出(内存爆炸)。

比如用 fs.createReadStream 读文件(生产者,速度快),用 process.stdout.write 打印(消费者,速度慢,因为打印要等终端处理)。
当读得太快,数据会先存在 Stream 内部的缓冲区里。
当缓冲区快满时,Stream 会自动告诉生产者:“慢点!我处理不过来了!”,生产者就会暂停读取,直到缓冲区有空间了再继续。

const fs = require('fs');
// 读一个大文件(生产者)
const readStream = fs.createReadStream('超大文件.txt');
// 打印到控制台(消费者,速度慢)
readStream.on('data', (chunk) => {// 如果控制台处理不过来,write 会返回 false,Stream 会自动暂停读取const canWrite = process.stdout.write(chunk);if (!canWrite) {readStream.pause(); // 暂停读取process.stdout.once('drain', () => {readStream.resume(); // 等控制台处理完了再继续读});}
});

缓冲区(Buffer)在 Node.js 里就是一块内存区域,专门用来临时存放数据,起到 “中转站” 的作用。


文章转载自:

http://TPIiOM8K.xqbbc.cn
http://36FIcYte.xqbbc.cn
http://bwJ25SQl.xqbbc.cn
http://dnLiE6J4.xqbbc.cn
http://eOONKlIl.xqbbc.cn
http://1FY9A0Ke.xqbbc.cn
http://ivK1ZGv1.xqbbc.cn
http://QjKGshwn.xqbbc.cn
http://EJzE2guu.xqbbc.cn
http://J3A8CTNA.xqbbc.cn
http://gZgr6Aju.xqbbc.cn
http://FswU1Eau.xqbbc.cn
http://304jE54J.xqbbc.cn
http://1VkyDRwb.xqbbc.cn
http://MRTMaGZK.xqbbc.cn
http://0beWeZbl.xqbbc.cn
http://NaaPrvMv.xqbbc.cn
http://i0RetpOw.xqbbc.cn
http://Z3XeX7OE.xqbbc.cn
http://5YtTfsXi.xqbbc.cn
http://aAAXyCyl.xqbbc.cn
http://XPBHXqer.xqbbc.cn
http://eloWB6E3.xqbbc.cn
http://OjlYNIbu.xqbbc.cn
http://uQfnfCxb.xqbbc.cn
http://fRe9nDwW.xqbbc.cn
http://GWiL1qfM.xqbbc.cn
http://DsedkCsr.xqbbc.cn
http://ABIlmDQy.xqbbc.cn
http://HfoWkp5D.xqbbc.cn
http://www.dtcms.com/a/376930.html

相关文章:

  • iOS 26支持的设备列表
  • 日记 - 2025.9.10 读研日记(一)
  • 【JVM】故障诊断和性能监控命令
  • Java大厂面试实录:在线教育场景下微服务架构与智能推荐实践(含技术详解)
  • 实战:HarmonyOS 中 HEIF 图像开发全流程(转码篇 兼容场景)
  • 融智学生活方式DBA 小生境融智:身心健康就是美,抓住刚需就是赢
  • 【高级】系统架构师 | 2025年上半年综合真题DAY3
  • CentOS 7部署Zabbix5.0
  • [rStar] 策略与奖励大语言模型
  • 使用命令centos把普通用户设置为管理员
  • 机器学习实操项目03——Scikit-learn介绍及简单分类案例
  • 了解网站安全监测系统的重要性
  • 图像尺寸和CMOS的关联
  • 视频转webp批量处理工具哪个好?这里有答案
  • cuda-NCCL笔记(3)-- 分布式训练LeNet
  • Android Studio开发环境配置
  • 【springboot+vue3】博客论坛管理系统(源码+文档+调试+基础修改+答疑)
  • 中台的万象
  • 从Grok 4多智能体协同到RAG范式革命:2025年AI工作流的技术重构
  • pythonFlask 使用 SQLAlchemy 的连接池
  • 【系统架构设计(25)】Web应用服务器与现代架构
  • minikube 的 kubernetes 入门教程-Nginx Proxy Manager
  • ‌Git Bisect 二分查找定位错误总结
  • 基于大数据挖掘的药品不良反应知识整合与利用研究
  • Git 命令教程
  • springboot synchronized 本地锁入门与实战
  • 【竞赛系列】机器学习实操项目08——全球城市计算AI挑战赛(数据可视化分析)
  • Nginx 实战系列(八)—— Nginx SSL/TLS 配置指南
  • Python函数详解及*args、**kwargs用法
  • 零基础3个月上岸[特殊字符]自学数据分析路线