【第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
你好!报错了啦
相关推荐
Q_Q196328847516 分钟前
python+django/flask基于协同过滤算法的理财产品推荐系统
spring boot·python·django·flask·node.js·php
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ29 分钟前
npm i / npm install 卡死不动解决方法
前端·npm·node.js
Kratzdisteln32 分钟前
【Cursor _RubicsCube Diary 1】Node.js;npm;Vite
前端·npm·node.js
半桶水专家4 小时前
npm run 的工作原理和工作流程
前端·npm·node.js
Q_Q19632884754 小时前
python+django/flask基于深度学习的个性化携程美食数据推荐系统
spring boot·python·深度学习·django·flask·node.js·php
Live&&learn5 小时前
nvm切换node版本时,npm不跟着切换解决
前端·npm·node.js
Q_Q5110082856 小时前
python+django/flask的篮球馆/足球场地/运动场地预约系统
spring boot·python·django·flask·node.js·php
Q_Q5110082856 小时前
python+django/flask的城市供水管网爆管预警系统-数据可视化
spring boot·python·django·flask·node.js·php
老前端的功夫13 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
浪裡遊18 小时前
Next.js路由系统
开发语言·前端·javascript·react.js·node.js·js