Stream
流
数据传输伎俩,是有程序的
它不像传统的程序那样一次将一个文件读入内存
而是逐块读取数据
比方:
1.看视频
视频资源不是一次性返回的;而是一点点从服务端流动到本地播放器
一边流动一边播放;这就是用的流
2.读大文件
如果用流,创立读取流createReadStream 通过pipe链接
能够一边读取一边返回 加重了服务器的压力;
如果间接用readFile;会将整个文件一次性返回,内存和网络可能会吃不消
品种
可写流:可写入数据的流。例如 fs.createWriteStream() 能够应用流将数据写入文件
可读流:可读取数据的流。例如fs.createReadStream() 能够从文件读取内容
双工流:既可读又可写的流。例如 net.Socket
转换流:能够在数据写入和读取时批改或转换数据的流。例如,在文件压缩操作中,能够向文件写入压缩数据,并从文件中读取解压数据
场景
实用于IO操作:http申请&文件操作
具体场景有:
- 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