理解 Node.js 中 Stream(流)


Stream(流) 是 Node.js 中處理流式數據的抽象接口。 stream 模塊用於構建實現了流接口的對象。

Node.js 提供了多種流對象。 例如,對 HTTP 服務器的request請求process.stdout(標准輸出), 都是流的實例。

流可以是可讀的、可寫的、或者可讀可寫的。 所有的流都是 EventEmitter 的實例。

Stream 的4種類型

1. Readable - 可讀的流(fs.createReadStream())

2. Writable - 可寫的流(fs.createWriteStream())

3. Duplex - 可讀可寫的流(net.Socket)

4. Transform - 操作被寫入數據,然后讀出結果。

所有的 Stream 對象都是 EventEmitter 的實例。常用的事件有:

data - 當有數據可讀時觸發

end - 沒有更多的數據可讀時觸發

error - 在接收和寫入過程中發生錯誤時觸發

finish - 所有數據已被寫入到底層系統時觸發

實例 - 讀寫流(復制文件)

把文件 data.txt 中的內容復制到 copy.txt:

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM