关于前端:每日灵魂一问对Node-中的-Stream-的理解应用场景

34次阅读

共计 1279 个字符,预计需要花费 4 分钟才能阅读完成。

Stream


数据传输伎俩 ,是有程序的
它不像传统的程序那样一次将一个文件读入内存
而是逐块读取数据

比方:
1. 看视频
视频资源不是一次性返回的;而是一点点从服务端流动到本地播放器
一边流动一边播放;这就是用的流

2. 读大文件
如果用 ,创立读取流 createReadStream 通过pipe 链接
能够 一边读取一边返回 加重了服务器的压力;
如果间接用 readFile;会将整个文件一次性返回,内存和网络可能会吃不消

品种

可写流 :可写入数据的流。例如 fs.createWriteStream() 能够应用流将数据 写入 文件

可读流 :可读取数据的流。例如 fs.createReadStream() 能够从文件 读取 内容

双工流 :既 可读又可写 的流。例如 net.Socket

转换流:能够在数据写入和读取时批改或转换数据的流。例如,在文件压缩操作中,能够向文件写入压缩数据,并从文件中读取解压数据

场景

实用于IO 操作:http 申请 & 文件操作

具体场景 有:

  1. get 申请返回文件给客户端
  2. 文件操作
  3. 一些打包工具的底层操作

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

正文完
 0