【第2章 Node.js基础】2.7 Node.js 的流(一)可写流

🌈可写流

🚀什么是可写流

可写流是对数据被写入的目的地的一种抽象。

所有可写流都实现了 stream.Writable类定义的接口。

可写流的例子包括,也都是实现了可写流接口的双工流

  • 客户端的 HTTP 请求、
  • 服务器的HTTP 响应、
  • fs 的写入流、
  • zlib 流、
  • crypto 流、
  • TCP Socket、
  • 子进程 stdin、
  • process.stdout、
  • process.stderr等。

尽管可写流的具体实例可能略有差别,但所有可写流都遵循同一基本的使用模式,下面用一个示例解释这种模式:

js 复制代码
const myStream = getWritableStreamSomehow();
myStream.write('一些数据');
myStream.write('更多数据');
myStream.end('完成写入数据');

stream.Writable 类定义的主要事件如下。

  • close:当流或其底层资源被关闭时被触发。不是所有可写流都会触发该事件。
  • drain: 如果调用 stream.write(chunk)方法返回 false,则当可以继续写入数据到流时会触发该
    事件。
  • error: 写入数据发生错误时被触发。当触发该事件时,流还未被关闭。
  • finish: 调用 stream.end()方法且缓冲数据都已传给底层系统之后被触发
  • pipe:当在可读流上调用 stream.pipe()方法时被触发。
  • unpipe:当在可读流上调用 stream.unpipe()方法时被触发。当可读流通过管道流向可写流发生错误时,也会触发该事件。

🐯案例:fs 的写入流

javascript 复制代码
const fs = require("fs");
let writeStream = fs.createWriteStream("outpuut.txt");
let str = "爱上一个不回家的人";
writeStream.write(str,'UTF8');
writeStream.end();
writeStream.on('finish',()=>{
    console.log("写入完成");
})
writeStream.on('error',(error)=>{
    console.log("写入失败:",error);
})

⭐️动图演示

🐯案例:process.stdout

进程 I/O 同样也是 Writable 和 EventEmitter 的实例,耳听为虚眼见为实,请同学们可以打印:

javascript 复制代码
const stream = require("stream");
const events = require("events");

console.log(process.stdout instanceof stream.Writable); // true
console.log(process.stdout instanceof events.EventEmitter); // true
javascript 复制代码
process.stdout.write('你好!');
process.stderr.write('报错了啦')

在 node.js 中 console.log 内部就是由 process.stdout 实现的。对应 console.error 内部就是由 process.stderr 实现的。(没错 process.stderr 也是可写流)。

⭐️输出

shell 复制代码
$ node .\process-写入流.js
你好!报错了啦
相关推荐
Python私教1 小时前
把开源 Agent 打包成"解压双击即用"的 Windows 便携包:一条命令的完整实现
node.js
没事别瞎琢磨3 小时前
十一、审计与 Run Session——每一步操作都被记录
人工智能·node.js
没事别瞎琢磨3 小时前
十六、AgentSandbox——把所有模块串起来的编排类
人工智能·node.js
没事别瞎琢磨3 小时前
十二、网络代理与白名单规则引擎
人工智能·node.js
没事别瞎琢磨3 小时前
十四、Git Worktree 隔离执行
人工智能·node.js
没事别瞎琢磨4 小时前
十、统一 Runner 入口——能力检测与模式回退
人工智能·node.js
没事别瞎琢磨5 小时前
八、环境隔离——构建安全的子进程环境
人工智能·node.js
没事别瞎琢磨6 小时前
六、输出捕获与截断
人工智能·node.js
没事别瞎琢磨6 小时前
七、敏感路径预检——Protected Paths
人工智能·node.js
没事别瞎琢磨6 小时前
五、进程执行——spawn、超时与进程树清理
人工智能·node.js