流(Stream)?听起来像是在看视频,其实差不多!
date
Nov 13, 2025
slug
nodejs-stream
status
Published
tags
Node.js
summary
嘿,小伙伴们!今天咱们聊聊 Node.js 里一个超级重要但总是让人迷糊的概念——流(Stream)。
type
Post
console.log 背后的小秘密
你以为
console.log 只是简单地打印东西?Too young too simple!这货其实偷偷做了两件事:
- 在你的字符串后面加了个
\\n(换行符)
- 把内容写进了
stdout这个流里
不信?看看这两个程序的区别:
运行效果就像这样:
三兄弟:stdin、stdout、stderr
Node 的
process 全局对象里住着三兄弟,对应 UNIX 的三个标准流:- stdin(标准输入):键盘敲进来的内容
- stdout(标准输出):正常的输出显示
- stderr(标准错误):错误信息专用通道
打个比方:想象你在餐厅点餐
- stdin = 你告诉服务员想吃啥(输入)
- stdout = 服务员端上来的正常菜品(正常输出)
- stderr = 厨师告诉你"不好意思,这菜卖完了"(错误输出)
重点来了:
stdin是可读流(你往里读数据)
stdout和stderr是可写流(你往里写数据)
stdin 默认在"摸鱼"状态
stdin 这家伙默认是**暂停(paused)**的。为啥?因为大部分程序是这样的:跑起来 → 做点事 → 退出。但有时候(就像咱们这个应用),程序需要一直待命,等用户输入。
当你恢复(resume)这个流时,Node 就开始盯着键盘(文件描述符 0),保持程序不退出,等着用户敲键盘。
流的编码小贴士:设置编码后,你拿到的是字符串(utf-8、ascii等),不设置就是原始的 Buffer(二进制数据)。
开始撸代码:做个文件浏览器!
咱们要做个小工具:列出当前目录的文件,让用户选一个,然后显示内容。
第一步:列出文件
那些奇怪的
\\033[31m 是啥? 这是终端的颜色代码!就像给文字穿衣服:\\033[31m= 穿上红色外套
\\033[36m= 换成青色
\\033[39m= 脱掉,恢复默认
第二步:逐个检查文件(串行执行模式)
这里出现了一个超重要的模式——串行执行!
为啥要递归? 因为
fs.stat 是异步的!如果用循环,所有文件会同时查询,顺序就乱了。递归保证了:查完第一个 → 查第二个 → 查第三个...代码重构:别让代码变成"俄罗斯套娃"
异步代码最容易出现的问题:回调地狱(Callback Hell)—— 函数套函数套函数...看着就头晕。
优化1:抽离变量
优化2:把读取用户输入单独抽出来
现在在
file() 函数里只需要调用 read() 就行了,清爽!优化3:处理用户选择
读取文件内容
但是...选的是目录怎么办?
简单!先把
stat 对象存起来:然后在
option 里判断:完成!🎉
恭喜你!你的第一个 Node 命令行工具诞生了!
回顾一下学到了啥:
- 流(Stream)就像水管,数据持续流动
stdin/stdout/stderr三兄弟各司其职
- 串行执行模式:一个接一个,不能乱
fs.readdir/fs.stat/fs.readFile三件套
- 代码重构让你的代码不再像"套娃"
下次见啦,小伙伴们!记得动手试试,光看是学不会的哦~ 😉
P.S. 那些终端颜色代码虽然看起来像乱码,但它们能让你的 CLI 工具瞬间高大上!就像给黑白照片上色一样。