Node.js進(jìn)行文件讀取與復(fù)制的系統(tǒng)總結(jié)
Node.js 文件讀取與復(fù)制相關(guān)內(nèi)容的系統(tǒng)總結(jié),包括 同步讀取、異步讀取、流式讀取、復(fù)制操作、兩者對(duì)比及內(nèi)存測(cè)試。
一、Node.js 文件讀取方式總結(jié)
Node.js 使用 fs(文件系統(tǒng))模塊進(jìn)行文件操作:
1.同步讀?。˙locking)
const fs = require('fs'); const data = fs.readFileSync('file.txt', 'utf-8'); console.log(data);
? 優(yōu)點(diǎn):邏輯簡(jiǎn)單,適合初始化配置、命令行工具等無需并發(fā)場(chǎng)景。
?缺點(diǎn):阻塞線程,讀取大文件會(huì)卡住整個(gè)應(yīng)用。
當(dāng)然可以!下面是一個(gè)使用 Node.js 同步方式進(jìn)行文件復(fù)制的完整例子,先同步讀取文件內(nèi)容,再同步寫入到目標(biāo)文件。
示例:使用 fs.readFileSync + fs.writeFileSync 實(shí)現(xiàn)文件復(fù)制
const fs = require('fs'); try { // 同步讀取源文件內(nèi)容 const data = fs.readFileSync('source.txt', 'utf-8'); // 同步寫入到目標(biāo)文件 fs.writeFileSync('target.txt', data); console.log('文件復(fù)制成功 ?'); } catch (err) { console.error('復(fù)制失敗 ?', err); }
說明:
- fs.readFileSync(path, encoding):阻塞方式讀取文件內(nèi)容
- fs.writeFileSync(path, data):阻塞方式將內(nèi)容寫入文件
- 適合小型文本文件復(fù)制(例如:配置文件、日志等)
注意:
會(huì)阻塞事件循環(huán),若文件大或復(fù)制頻繁,不適合用在服務(wù)端生產(chǎn)環(huán)境。
大文件建議使用流式復(fù)制方式。
2. 異步讀取(Non-blocking)
const fs = require('fs'); fs.readFile('file.txt', 'utf-8', (err, data) => { if (err) throw err; console.log(data); });
- ? 優(yōu)點(diǎn):非阻塞、適合高并發(fā),不會(huì)卡住主線程。
- ?缺點(diǎn):邏輯較復(fù)雜,需使用回調(diào)、Promise 或 async/await。
3. 流式讀?。⊿tream)
const fs = require('fs'); const readStream = fs.createReadStream('file.txt', 'utf-8'); readStream.on('data', chunk => { console.log('讀取塊:', chunk); }); readStream.on('end', () => { console.log('讀取完成'); });
- ? 優(yōu)點(diǎn):適合讀取大文件、低內(nèi)存消耗
- ?缺點(diǎn):實(shí)現(xiàn)復(fù)雜,處理邏輯需分塊處理。
二、讀取場(chǎng)景對(duì)比
方式 | 適合場(chǎng)景 | 特點(diǎn) |
---|---|---|
同步讀取 | 小文件、本地 CLI 工具等 | 簡(jiǎn)單,阻塞線程 |
異步讀取 | Web 服務(wù)、文件上傳 | 非阻塞,高性能 |
流式讀取 | 視頻、大型日志、備份等 | 節(jié)省內(nèi)存,分塊 |
三、Node.js 文件復(fù)制方式
1. 同步復(fù)制
const fs = require('fs'); fs.copyFileSync('source.txt', 'target.txt');
? 簡(jiǎn)單,適合少量小文件。
?阻塞線程,大量并發(fā)時(shí)不可用。
2. 流式復(fù)制(推薦)
const fs = require('fs'); const readStream = fs.createReadStream('source.txt'); const writeStream = fs.createWriteStream('target.txt'); readStream.pipe(writeStream);
? 非阻塞,適合大文件。
? 邊讀邊寫,內(nèi)存占用低。
? 無法輕松控制復(fù)制進(jìn)度或中斷。
四、復(fù)制方式對(duì)比
方法 | 內(nèi)存占用 | 性能 | 使用場(chǎng)景 |
---|---|---|---|
同步復(fù)制 | 高 | 低 | 小型項(xiàng)目、工具類 |
流式復(fù)制 | 低 | 高 | 服務(wù)端、大文件 |
五、內(nèi)存占用測(cè)試示例
可以通過 process.memoryUsage() 查看 Node.js 內(nèi)存使用:
console.log(process.memoryUsage());
示例:對(duì)比讀取一個(gè) 500MB 文件時(shí)的內(nèi)存變化:
// 流式讀取內(nèi)存較低 const stream = fs.createReadStream('bigfile.txt'); stream.on('data', chunk => { console.log(process.memoryUsage().heapUsed); }); // readFileSync 讀取整個(gè)文件占用大 const content = fs.readFileSync('bigfile.txt'); console.log(process.memoryUsage().heapUsed);
總結(jié)重點(diǎn)
功能 | 同步 | 異步 | 流式 |
---|---|---|---|
阻塞 | ? 是 | ? 否 | ? 否 |
內(nèi)存消耗 | ? 高 | ?? 中 | ? 低 |
實(shí)現(xiàn)復(fù)雜度 | ? 簡(jiǎn)單 | ?? 中等 | ? 高 |
適合場(chǎng)景 | 啟動(dòng)、工具 | Web 服務(wù) | 大文件處理 |
到此這篇關(guān)于Node.js進(jìn)行文件讀取與復(fù)制的系統(tǒng)總結(jié)的文章就介紹到這了,更多相關(guān)Node.js文件讀取與復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地
這篇文章主要為大家介紹了node+axios實(shí)現(xiàn)下載外網(wǎng)文件到本地示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題
這篇文章主要介紹了關(guān)于Node.js中頻繁修改代碼重啟服務(wù)器的問題,本文給大家分享解決辦法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10node pnpm修改默認(rèn)包的存儲(chǔ)路徑(操作方法)
PNPM是一個(gè)新的包管理工具,也是NPM的另一個(gè)替代方案,與NPM不同,PNPM使用符號(hào)鏈接(symlink)而不是復(fù)制文件來安裝包,這篇文章主要介紹了node pnpm修改默認(rèn)包的存儲(chǔ)路徑,需要的朋友可以參考下2024-05-05node.js利用express自動(dòng)搭建項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于node.js利用express自動(dòng)搭建項(xiàng)目的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04手把手教你用Node.js爬蟲爬取網(wǎng)站數(shù)據(jù)的方法
這篇文章主要介紹了手把手教你用Node.js爬蟲爬取網(wǎng)站數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07