Node Stream

2018-02-22  本文已影响0人  yanyongchao

流的概念

  1. 流是一组有序的,有起点和终点的字节数据传输手段
  2. 它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理
  3. 流是一个抽象接口,被 Node 中的很多对象所实现。比如HTTP 服务器request和response对象都是流。

流的种类

  1. Readable - 可读的流 (如 fs.createReadStream());
  2. Writable - 可写的流 (如 fs.createWriteStream());
  3. Duplex -
    可读写的流 (如 net.Socket);
  4. Transform - 在读写过程中可以修改和变换数据的 Duplex 流 (如 zlib.createDeflate());

可读流Readable

可读流分为两种,flowing模式和paused模式,主要区别就是paused有缓冲区的概念,而flowing没有

在 flowing 模式下, 可读流自动从系统底层读取数据,并通过 EventEmitter 接口的事件尽快将数据提供给应用。

在 paused 模式下,必须显式调用 stream.read() 方法来从流中读取数据片段。
所有初始工作模式为 paused 的 Readable 流,可以通过下面三种途径切换到 flowing 模式:

  1. 监听 'data' 事件
  2. 调用 stream.resume() 方法
  3. 调用 stream.pipe() 方法将数据发送到 Writable

flowing模式

const fs = require('fs')
const path = require('path')
const rs = fs.createReadStream(path.join(__dirname, './1.txt'))

rs.setEncoding('utf8')

rs.on('data', (data) => {
    console.log(data)
})

paused模式

const fs = require('fs')
const path = require('path')
const rs = fs.createReadStream(path.join(__dirname, './1.txt'))

rs.setEncoding('utf8')

rs.on('readable', () => {
    let d = rs.read(1)
    console.log(d)
})

可写流writeable

实现了stream.Writable接口的对象来将流数据写入到对象中

const fs = require('fs')
const path = require('path')
const ws = fs.createWriteStream(path.join(__dirname, './1.txt'))

ws.write('123')
ws.end('456')

对于Duplex,Transfor个人觉得会用就好了,理解也很容易,多看看api就好

上一篇下一篇

猜你喜欢

热点阅读