-
管道流最经典的管道流图
-
我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。
image.png
-
-
什么是stream
- 每个stream对象都是一个水桶,通过管道pipe流到dest目标里
- stream是一个抽象接口,node中有很多对象实现了这个接口
- 对http服务器发起请求的request对象就是一个stream流
-
了解stream流能处理的问题,了解IO操作的性能瓶颈概念
- IO包括'网络IO'和'文件IO'
- 相比于CPU计算和内存读写,IO的突出特点就是:慢!
- 在有限的硬件资源下提高IO的操作效率
- stream流能提升IO的的操作效率的方法
-
stream基础实例(根据实际项目变通使用)
- 标准输入输出
process.stdin.pipe(process.stdout)
- http的pipe管道
const http = require('http') const server = http.createServer((req, res) => { if(req.method === 'POST') { req.pipe(res) // pipe管道 } }) server.listen(8000)
- stream拷贝文件(拷贝效率高)
var fs = require('fs') var path = require('path') // 两个文件名 var fileName1 = path.resolve(__dirname, 'data.txt') var fileName2 = path.resolve(__dirname, 'databak.txt') // 读取文件的stream流 var readStream = fs.createReadStream(fileName1) // 写入文件的stream流 var writeStream = fs.createWriteStream(fileName2) // 通过拷贝,执行pipe readStream.pipe(writeStream) // 可以监听data,查看每一步操作的数据 readStream.on('data', chunk => { console.log(chunk.toString()); }) // 数据读取完成,即拷贝完成 readStream.on('end', function() { console.log('拷贝完成'); })
- stream读取文件
const http = require('http') const path = require('path') const fs = require('fs') const server = http.createServer((req, res) => { if(req.method === 'GET') { var fileName = path.resolve(__dirname, 'data.txt') var stream = fs.createReadStream(fileName) stream.pipe(res) // 将res作为stream的dest } }) server.listen(8000)
- 标准输入输出
网友评论