三个例子了解 Stream

第一个Stream例子

const fs = require('fs')
const stream = fs.createWriteStream('./big_file.txt') 
for(let i=0;i<10000;i++)[
    stream.write(`这是第${i}行内容,我们需要很多很多内容,要不停地写文件啊啊啊啊啊啊回车\n`)
}
stream.end()//别忘了关掉 stream
console.log('done')

分析
打开流,多次往里面塞内容,关闭流
看起来就是可以多次写嘛,没什么大不了的
最终我们得到一个128兆左右的文件

Stream流

Stream流

释义
stream是水流,但默认没有水
stream.write 可以让水流中有水(数据)
每次写的小数据叫做chunk(块)
产生数据的一段叫做source(源头)
得到数据的一段叫做sink(水池)

第二个例子

const http = require("http");
const fs = require("fs");
const server = http.createServer()
server.on('request', (request, response) => {
    fs.readFile('./big_file.txt', (error, data) => {
        if (error) throw error
        response.end(data)
        console.log('done')
    })
})
server.listen(8888)

分析
用任务管理器看Node.js,内存占用,大概130Mb;

第三个例子

const http = require('http')
const fs = require('fs')
const server = http.createServer()
server.on('request', (request, response) => {
    const stream = fs.createReadStream('./big_file.txt')
    stream.pipe(response)
})

server.listen(8888)

** 分析**

  • 查看 Node.is 内存占用,基本不会高于30 Mb
  • 文件 stream 和 response stream 通过管道相连

管道

image.png

释义
两个流可以用一个管道相连
stream1的末尾连接上stream2的开端只要stream1有数据,就会流到stream2
常用代码
stream1.pipe(stream2)
链式操作
a.pipe(b).pipe(c)
//等价于
a.pipe(b)
b.pipe(c)

管道续

管道可以通过事件实现

// stream1 一有数据就塞给 
stream2stream1.on('data', (chunk) => {
    stream2.write(chunk)
})
// stream1 停了,就停掉 
stream2stream1.on('end', () => {
    stream2.end()
})
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • stream 释义 stream 是水流,但默认没有水 stream.write 可以让水流中有水(数据) 每次写...
    littleyu阅读 390评论 0 0
  • 一.node.js中的流是什么 stream(流)是Node.js提供的又一个仅在服务区端可用的模块,流是一种抽象...
    nightZing阅读 6,152评论 4 16
  • 第一个stream的例子: 创建流,多次往里面填充内容,关闭流 最终得到一个100MB的文件 stream-流 s...
    西域战神阅读 594评论 0 0
  • stream 流是一个抽象接口,在 Node 里被不同的对象实现。例如 request to an HTTP se...
    明明三省阅读 3,451评论 1 10
  • 接触过 Node.js 的开发人员可能知道,流(Stream)这个概念比较难理解,也不太好处理。 用 Domini...
    1024译站阅读 1,543评论 0 1