以文件讀取為例,在NodeJS中有兩種類型的讀寫文件的方式鹰椒,一種是通過fs.readFile()
和fs.writeFile()
方法
-
fs.readFile()
方法的參數(shù)票灰,為文件的名字和一個(gè)回調(diào)函數(shù)蔬墩,其中回調(diào)函數(shù)接收兩個(gè)參數(shù):-
err
:如果讀取錯(cuò)誤斤贰,則返回一個(gè)錯(cuò)誤對(duì)象; -
data
:如果讀取成功殖侵,則返回讀取后的數(shù)據(jù)贸呢;
-
-
fs.writeFile()
方法的參數(shù)-
fileName
:要寫入的目標(biāo)文件; -
data
:要寫入的數(shù)據(jù)拢军; -
option
:寫入的配置參數(shù)楞陷; -
callback
:寫入成功后的回調(diào)函數(shù),接收寄一個(gè)參數(shù)err
茉唉,如果寫入文件失敗固蛾,則用err
,接收錯(cuò)誤對(duì)象
-
示例:
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')
})
})
這里就引出了在服務(wù)器端讀取文件的問題度陆,由于計(jì)算機(jī)為單個(gè)的NodeJS進(jìn)程分配的系統(tǒng)資源是有限制的艾凯,單個(gè)NodeJS服務(wù)進(jìn)程最大被分配的內(nèi)存為3GB,用上面的這種方式讀取和寫入文件懂傀,是把讀取后和要寫入的數(shù)據(jù)整體作為變量览芳,存儲(chǔ)在計(jì)算機(jī)的內(nèi)存中,如果目標(biāo)文件體積過大鸿竖,就會(huì)直接完全占用系統(tǒng)資源,造成服務(wù)崩潰铸敏。所以在NodeJS中缚忧,通常使用stream技術(shù),進(jìn)行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球榆,將文件分段讀取并逐步寫入目標(biāo)文件朽肥,可以有效降低服務(wù)器的系統(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')
})
服務(wù)器IO操作的瓶頸持钉,不止有硬件瓶頸衡招,同時(shí)還有網(wǎng)絡(luò)瓶頸,使用數(shù)據(jù)流的形式來操作文件讀取的方式在網(wǎng)絡(luò)流媒體(在線視頻每强,音樂網(wǎng)站始腾,視頻直播,短視頻···)等需要對(duì)較大文件進(jìn)行讀寫操作的場(chǎng)景下空执,可以有效降低網(wǎng)絡(luò)負(fù)載浪箭,并減少用戶等待時(shí)間,提高用戶體驗(yàn)辨绊。