NodeJS通過stream操作IO

以文件讀取為例,在NodeJS中有兩種類型的讀寫文件的方式,一種是通過fs.readFile()fs.writeFile()方法

  • fs.readFile()方法的參數(shù),為文件的名字和一個回調(diào)函數(shù),其中回調(diào)函數(shù)接收兩個參數(shù):
    1. err:如果讀取錯誤,則返回一個錯誤對象;
    2. data:如果讀取成功,則返回讀取后的數(shù)據(jù);
  • fs.writeFile()方法的參數(shù)
    1. fileName:要寫入的目標文件;
    2. data:要寫入的數(shù)據(jù);
    3. option:寫入的配置參數(shù);
    4. callback:寫入成功后的回調(diào)函數(shù),接收寄一個參數(shù)err,如果寫入文件失敗,則用err,接收錯誤對象

示例:

const fs = require('fs')
const path = require('path')

let fileName1 = path.resolve(__dirname, 'data.txt')
let fileName2 = path.resolve(__dirname, 'data_bar_02.txt')

fs.readFile(fileName1, (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  
  fs.writeFile(fileName2, data, {
    flags: 'a'
  }, (err) => {
    if (err) {
      console.error(err)
      return
    }
    console.log('clone done')
  })
})

這里就引出了在服務器端讀取文件的問題,由于計算機為單個的NodeJS進程分配的系統(tǒng)資源是有限制的,單個NodeJS服務進程最大被分配的內(nèi)存為3GB,用上面的這種方式讀取和寫入文件,是把讀取后和要寫入的數(shù)據(jù)整體作為變量,存儲在計算機的內(nèi)存中,如果目標文件體積過大,就會直接完全占用系統(tǒng)資源,造成服務崩潰。所以在NodeJS中,通常使用stream技術(shù),進行IO操作。

通過stream操作IO

在NodeJS中,通過stream技術(shù),讀取和寫入文件,主要是通過fs.createReadStream()createWriteStream()方法

// 利用stream操作文件
const fs = require('fs')
const path = require('path')

const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname,'data_bak.txt')

const readStream = fs.createReadStream(fileName1)
const writeStream = fs.createWriteStream(fileName2)

readStream.pipe(writeStream)
readStream.on('data', (chunk) => {
  console.log(chunk.toString())
})
readStream.on('end', () => {
  console.log('copy done')
})

使用數(shù)據(jù)流方式讀取操作IO,將文件分段讀取并逐步寫入目標文件,可以有效降低服務器的系統(tǒng)開銷。再看下面的例子:

const http = require('http')
const fs = require('fs')
const path = require('path')

const app = http.createServer((req, res) => {
  if (req.method === 'GET') {
    let fileName = path.resolve(__dirname, 'data.txt')
    let readStream = fs.createReadStream(fileName)
    readStream.pipe(res)
  }
})

app.listen(8000, () => {
  console.log('running on 8000')
})

服務器IO操作的瓶頸,不止有硬件瓶頸,同時還有網(wǎng)絡瓶頸,使用數(shù)據(jù)流的形式來操作文件讀取的方式在網(wǎng)絡流媒體(在線視頻,音樂網(wǎng)站,視頻直播,短視頻···)等需要對較大文件進行讀寫操作的場景下,可以有效降低網(wǎng)絡負載,并減少用戶等待時間,提高用戶體驗。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容