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


    🌈可写流

    🚀什么是可写流

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

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

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

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

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

    const myStream = getWritableStreamSomehow();
    myStream.write('一些数据');
    myStream.write('更多数据');
    myStream.end('完成写入数据');
    
    • 1
    • 2
    • 3
    • 4

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

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

    🐯案例:fs 的写入流

    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);
    })
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ⭐️动图演示

    在这里插入图片描述

    🐯案例:process.stdout

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

    const stream = require("stream");
    const events = require("events");
    
    console.log(process.stdout instanceof stream.Writable); // true
    console.log(process.stdout instanceof events.EventEmitter); // true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    process.stdout.write('你好!');
    process.stderr.write('报错了啦')
    
    • 1
    • 2

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

    ⭐️输出

    $ node .\process-写入流.js
    你好!报错了啦
    
    • 1
    • 2
  • 相关阅读:
    从零实现深度学习框架——Seq2Seq从理论到实战【理论】
    GAMES101复习:光栅化
    具有 1 个射频链的 OFDM-MIMO 系统的波束训练(Matlab代码实现)
    Linux - Django + Nginx + uwsgi 部署项目 - 安装 uWSGI 服务器 -(4)
    自学C++ day01
    java毕业生设计学生培训管理系统计算机源码+系统+mysql+调试部署+lw
    载顺铂/环丙沙星壳聚糖温敏性水凝胶/温敏性壳聚糖-谷胱甘肽水凝胶/载EPO和Aspirin壳聚糖水凝胶的研究制备方法
    拓世AI|中秋节营销攻略,创意文案和海报一键生成
    jenkins 发布项目到k8s tomcat
    前端请求XMLHttpRequest详解
  • 原文地址:https://blog.csdn.net/No_Name_Cao_Ni_Mei/article/details/134447524