流的概念
- 流是一組有序的,有起點和終點的字節(jié)數(shù)據(jù)傳輸手段
- 它不關(guān)心文件的整體內(nèi)容陈惰,只關(guān)注是否從文件中讀到了數(shù)據(jù)疏咐,以及讀到數(shù)據(jù)之后的處理
- 流是一個抽象接口,被 Node 中的很多對象所實現(xiàn)阐肤。比如HTTP 服務(wù)器request和response對象都是流凫佛。
流的種類
- Readable - 可讀的流 (如 fs.createReadStream());
- Writable - 可寫的流 (如 fs.createWriteStream());
- Duplex -
可讀寫的流 (如 net.Socket); - Transform - 在讀寫過程中可以修改和變換數(shù)據(jù)的 Duplex 流 (如 zlib.createDeflate());
可讀流Readable
可讀流分為兩種,flowing模式和paused模式,主要區(qū)別就是paused有緩沖區(qū)的概念孕惜,而flowing沒有
在 flowing 模式下愧薛, 可讀流自動從系統(tǒng)底層讀取數(shù)據(jù),并通過 EventEmitter 接口的事件盡快將數(shù)據(jù)提供給應(yīng)用衫画。
在 paused 模式下毫炉,必須顯式調(diào)用 stream.read() 方法來從流中讀取數(shù)據(jù)片段。
所有初始工作模式為 paused 的 Readable 流碧磅,可以通過下面三種途徑切換到 flowing 模式:
- 監(jiān)聽 'data' 事件
- 調(diào)用 stream.resume() 方法
- 調(diào)用 stream.pipe() 方法將數(shù)據(jù)發(fā)送到 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
實現(xiàn)了stream.Writable接口的對象來將流數(shù)據(jù)寫入到對象中
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就好