流(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!
这货其实偷偷做了两件事:
  1. 在你的字符串后面加了个 \\n(换行符)
  1. 把内容写进了 stdout 这个流里
不信?看看这两个程序的区别:
运行效果就像这样:

三兄弟:stdin、stdout、stderr

Node 的 process 全局对象里住着三兄弟,对应 UNIX 的三个标准流:
  • stdin(标准输入):键盘敲进来的内容
  • stdout(标准输出):正常的输出显示
  • stderr(标准错误):错误信息专用通道
打个比方:想象你在餐厅点餐
  • stdin = 你告诉服务员想吃啥(输入)
  • stdout = 服务员端上来的正常菜品(正常输出)
  • stderr = 厨师告诉你"不好意思,这菜卖完了"(错误输出)
重点来了:
  • stdin可读流(你往里读数据)
  • stdoutstderr可写流(你往里写数据)

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 命令行工具诞生了!
回顾一下学到了啥:
  1. 流(Stream)就像水管,数据持续流动
  1. stdin/stdout/stderr 三兄弟各司其职
  1. 串行执行模式:一个接一个,不能乱
  1. fs.readdir / fs.stat / fs.readFile 三件套
  1. 代码重构让你的代码不再像"套娃"
下次见啦,小伙伴们!记得动手试试,光看是学不会的哦~ 😉

P.S. 那些终端颜色代码虽然看起来像乱码,但它们能让你的 CLI 工具瞬间高大上!就像给黑白照片上色一样。

© 拾光 2025 - 2026

粤ICP备2025472574号