流的概念
- 流是一组有序的,有起点和终点的字节数据传输手段
- 它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理
- 流是一个抽象接口,被 Node 中的很多对象所实现。比如HTTP 服务器request和response对象都是流。
流的种类
- Readable - 可读的流 (如 fs.createReadStream());
- Writable - 可写的流 (如 fs.createWriteStream());
- Duplex -
可读写的流 (如 net.Socket); - Transform - 在读写过程中可以修改和变换数据的 Duplex 流 (如 zlib.createDeflate());
可读流Readable
可读流分为两种,flowing模式和paused模式,主要区别就是paused有缓冲区的概念,而flowing没有
在 flowing 模式下, 可读流自动从系统底层读取数据,并通过 EventEmitter 接口的事件尽快将数据提供给应用。
在 paused 模式下,必须显式调用 stream.read() 方法来从流中读取数据片段。
所有初始工作模式为 paused 的 Readable 流,可以通过下面三种途径切换到 flowing 模式:
- 监听 'data' 事件
- 调用 stream.resume() 方法
- 调用 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就好