14

面试官:说说你对 Node 中的 Stream 的理解

 2 years ago
source link: https://blog.51cto.com/u_15875573/5968619
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是CoderBin

面试官:“说说你对Node中的Stream的理解”

紧张的萌新:“好像是一种流?…”

面试官:“…”

······

又来到了面试官系列,本次讲解的是node中关于Stream的相关知识,属于node知识的范围。希望对大家有所帮助,谢谢!
如果文中有不对、疑惑的地方,欢迎在评论区留言指正🌻

一、是什么

流(Stream),是一个数据传输手段,是端到端信息交换的一种方式,而且是有顺序的,是逐块读取数据、处理内容,用于顺序读取输入或写入输出

Node.js中很多对象都实现了流,总之它是会冒数据(以 Buffer 为单位)

它的独特之处在于,它不像传统的程序那样一次将一个文件读入内存,而是逐块读取数据、处理其内容,而不是将其全部保存在内存中

流可以分成三部分:sourcedestpipe

sourcedest之间有一个连接的管道pipe,它的基本语法是source.pipe(dest)sourcedest就是通过pipe连接,让数据从source流向了dest,如下图所示:

面试官:说说你对 Node 中的 Stream 的理解_面试

NodeJS,几乎所有的地方都使用到了流的概念,分成四个种类:

  • 可写流:可写入数据的流。例如 fs.createWriteStream() 可以使用流将数据写入文件
  • 可读流:可读取数据的流。例如 fs.createReadStream() 可以从文件读取内容
  • 双工流:既可读又可写的流。例如 net.Socket
  • 转换流:可以在数据写入和读取时修改或转换数据的流。例如,在文件压缩操作中,可以向文件写入压缩数据,并从文件中读取解压数据

NodeJSHTTP服务器模块中,request 是可读流,response 是可写流。还有fs 模块,能同时处理可读和可写文件流

可读流和可写流都是单向的,比较容易理解,而另外两个是双向的

1. 双工流

比如说websocket通信,是一个全双工通信,发送方和接受方都是各自独立的方法,发送和接收都没有任何关系

如下图所示:

面试官:说说你对 Node 中的 Stream 的理解_数据流_02

基本代码如下:

const { Duplex } = require('stream');

const myDuplex = new Duplex({
  read(size) {
    // ...
  },
  write(chunk, encoding, callback) {
    // ...
  }
});

双工流的演示图如下所示:

面试官:说说你对 Node 中的 Stream 的理解_面试_03

除了上述压缩包的例子,还比如一个 babel,把es6转换为,我们在左边写入 es6,从右边读取 es5

基本代码如下所示:

const { Transform } = require('stream');

const myTransform = new Transform({
  transform(chunk, encoding, callback) {
    // ...
  }
});

三、应用场景

stream的应用场景主要就是处理IO操作,而http请求和文件操作都属于IO操作

思想一下,如果一次IO操作过大,硬件的开销就过大,而将此次大的IO操作进行分段操作,让数据像水管一样流动,知道流动完成

常见的场景有:

  • get请求返回文件给客户端
  • 一些打包工具的底层操作

1. get请求返回文件给客户端

使用stream流返回文件,res也是一个stream对象,通过pipe管道将文件数据返回

const server = http.createServer(function (req, res) {
  const method = req.method; // 获取请求方法
  if (method === 'GET') { // get 请求
      const fileName = path.resolve(__dirname, 'data.txt');
      let stream = fs.createReadStream(fileName);
      stream.pipe(res); // 将 res 作为 stream 的 dest
  }
});
server.listen(8000);

2. 文件操作

创建一个可读数据流readStream,一个可写数据流writeStream,通过pipe管道把数据流转过去

const fs = require('fs')
const path = require('path')

// 两个文件名
const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname, 'data-bak.txt')
// 读取文件的 stream 对象
const readStream = fs.createReadStream(fileName1)
// 写入文件的 stream 对象
const writeStream = fs.createWriteStream(fileName2)
// 通过 pipe执行拷贝,数据流转
readStream.pipe(writeStream)
// 数据读取完成监听,即拷贝完成
readStream.on('end', function () {
    console.log('拷贝完成')
})

3. 一些打包工具的底层操作

目前一些比较火的前端打包构建工具,都是通过node.js编写的,打包和构建的过程肯定是文件频繁操作的过程,离不来stream,如gulp


每文一句:少而不学,老而无识。

本次的分享就到这里,如果本章内容对你有所帮助的话欢迎点赞+收藏。文章有不对的地方欢迎指出,有任何疑问都可以在评论区留言。希望大家都能够有所收获,大家一起探讨、进步!


Recommend

  • 62

    一般而言架构都是随着需求而改动的,以需求为导向。现在关系型数据库还是主流,也是我们系统中必不可少的一部分。 但是应对有些需求的时候,关系型数据库往往就撑不住了,需要非关系型数据库来补充它。关系型数据库会有哪些问题呢? 关系型数据库 行存储结构 如关...

  • 29
    • www.cnblogs.com 5 years ago
    • Cache

    面试官: 说说你对async的理解

    大家好,我是小雨小雨,致力于分享有趣的、实用的技术文章。 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步。 分享不易,希望能够得到大家的支持和关注。 TL;DR async...

  • 27

    在每个面向对象编程语言中都会涉及到一个指向当前对象的值,this( 当然,python不是的)。但是this本身在很多时候都是有"歧义"的,因为不同的理解容易造成意想不到的bug产生。

  • 12
    • developer.51cto.com 4 years ago
    • Cache

    面试官:说说你对序列化的理解

    本文主要内容 背景 在Java语言中,程序运行的时候,会产生很多对象,而对象信息也只是在程序运行的时候才在内存中保持其状态,一旦程序停止,内存释放,对象也就不存在了。 怎么能让对象永久的保存下来呢?--------对象...

  • 16

    谈一谈你对BFC/IFC的理解「前端剑指offer」饥人谷若愚饥人谷前端,培养有灵魂的前端工程师

  • 6
    • www.gelonghui.com 4 years ago
    • Cache

    你对“抱团”的理解可能是错的

    首页 > 文章详情 你对“抱团”的理解可能是错的 热点直击 前天14:01 作者:王焱珂 来源:少数派投资虽然2020年A股交出了一份靓丽的答卷,万得全A的全年上...

  • 7
    • www.cxyxiaowu.com 3 years ago
    • Cache

    谈谈你对停止等待协议的理解?

    谈谈你对停止等待协议的理解?-吴师兄学编程 当前位置:吴师兄学编程 > 计算机网络 > 谈谈你对停止等待协议的理解? ...

  • 8
    • www.cxyxiaowu.com 3 years ago
    • Cache

    谈下你对流量控制的理解?

    谈下你对流量控制的理解?-吴师兄学编程 当前位置:吴师兄学编程 > 计算机网络 > 谈下你对流量控制的理解? ...

  • 10

    Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,面试官最想听到的和其实想问的应该是哪些?下面我们通过以下几点来剖析这...

  • 9

    面试官:说说你对react生命周期的理解hello,这里是潇晨,今天我们来看下react生命周期在各个阶段是怎样执行的,在面试的过程中有没有遇到这个问题呢,大家也可以学习往期react源码体系文章哦,往期文章目录在文章结尾。...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK