Stream(流)
是 Node.js 中處理流式數據的抽象接口。 stream 模塊用於構建實現了流接口的對象。服務器
Node.js 提供了多種流對象。 例如,對 HTTP 服務器的request請求
和 process.stdout
(標準輸出), 都是流的實例。ui
流能夠是可讀的、可寫的、或者可讀可寫的。 全部的流都是 EventEmitter 的實例。code
1. Readable - 可讀的流(fs.createReadStream()) 2. Writable - 可寫的流(fs.createWriteStream()) 3. Duplex - 可讀可寫的流(net.Socket) 4. Transform - 操做被寫入數據,而後讀出結果。
全部的 Stream 對象都是 EventEmitter 的實例。經常使用的事件有:orm
data - 當有數據可讀時觸發 end - 沒有更多的數據可讀時觸發 error - 在接收和寫入過程當中發生錯誤時觸發 finish - 全部數據已被寫入到底層系統時觸發
把文件 data.txt 中的內容複製到 copy.txt:server
const fs = require('fs') const path = require('path') const fileName1 = path.resolve(__dirname, 'data.txt') const fileName2 = path.resolve(__dirname, 'copy.txt') // 建立一個可讀流, 讀取原文件的 stream 對象 const readStream = fs.createReadStream(fileName1) // 建立一個可寫流, 寫入文件的 stream 對象 const writeStream = fs.createWriteStream(fileName2, { flags: 'a' // a 表示追加寫入, 若是須要覆蓋寫入,則用 'w' }) // 管道讀寫操做 // 讀取 input.txt 文件內容,並將內容寫入到 output.txt 文件中 readStream.pipe(writeStream) // 逐漸的打印被讀取的文件, 直到所有讀取完成 readStream.on('data', chunk => { console.log(chunk.toString()) }) // 讀取完成後執行 readStream.on('end', () => { console.log('所有複製完成') })
例如文件 data.txt 放在服務端,經過 get 請求讀取:對象
const http = require('http') const fs = require('fs') const path = require('path') const fileName1 = path.resolve(__dirname, 'data.txt') const server = http.createServer((req, res) => { if (req.method === 'GET') { const readStream = fs.createReadStream(fileName1) readStream.pipe(res) } }) server.listen(3333)