Node.js核心API(fs篇)

前言:

????????在Node.js生態系統中,文件系統操作是后端開發不可或缺的一部分。fs模塊作為Node.js核心API的重要組成部分,提供了與文件系統交互的能力,涵蓋了從基礎的文件讀寫到復雜的目錄操作等功能。

????????現代JavaScript開發中,處理本地文件是常見需求,無論是配置文件讀取、日志記錄還是數據持久化存儲。fs模塊通過同步和異步兩種方式提供這些功能,適應不同場景的性能要求。

????????隨著Node.js版本的迭代,fs模塊不斷加入新的特性,如Promise-based API的引入,使得文件操作能夠更好地融入現代異步編程模式。理解并掌握fs模塊,對于構建健壯的Node.js應用具有重要意義。

????????本部分內容將深入解析fs模塊的核心功能,包括常用方法的原理和使用場景,幫助開發者高效安全地處理文件系統操作,為構建復雜應用打下堅實基礎。

1.讀取文件

1.同步

? ? ? ? 使用readFileSync方法,它的寫法簡潔,但會阻塞后面的代碼執行,基本代碼如下:

const fs = require('fs')// 同步寫法 會阻塞后面代碼執行
const read = fs.readFileSync('./a.txt', 'utf8')
console.log(read)

? ? ? ? 在終端中使用 node 文件名 將內容打印出來

????????readFileSync('需要讀取文件的文件名', '編碼')

2.異步

????????使用readFile方法,它接收三個參數,第一個是需要讀取文件的文件名,第二個參數可以接受一個對象,可以在里面設置一些行為,就比如說設置讀取到文字的編碼,第三個參數接受一個回調函數,基本的寫法如下:

const fs = require('fs')// 異步
fs.readFile('./a.txt', {encoding: 'utf8', // 編碼flag: 'r' // 讀取
}, (err, data) => {if (err) throw err // 將錯誤拋出console.log(data)
})

3.promise

? ? ? ? 這種寫法就可以通過.then或.catch來處理成功或失敗的結果,我個人還是推薦使用這種寫法。代碼如下:

const fs = require('fs/promises')// promise
fs.readFile('./a.txt').then(result => {console.log(result.toString('utf8'));
}).catch(err => {throw err
}).finally(()=>{console.log('不管成功與否我都執行');
})

? ? ? ? 看到這可能有些人有點蒙,為什么編碼有這么多種寫法,其實這三種都是可以的,看個人習慣,以及需求。

4.可讀流

? ? ? ? 在處理大文件時會使用到可讀流,它會將文件里的內容一點一點傳過來,假設有一個很大內存的文件,不可能使用readFile一直等著,代碼如下:

const fs = require('fs')// 可讀流 處理大文件
const readStream = fs.createReadStream('./a.txt')readStream.on('data', chunk => {console.log(chunk.toString())
})readStream.on('end', () => {console.log('讀取完成了')
})

2.創建文件夾

? ? ? ? 使用到了mkdirSync,一般都是同步的,因為創建一個文件夾的速度是非常快的。代碼如下:

const fs = require('fs')// 創建文件夾
fs.mkdirSync('./a')

? ? ? ? 如果需要創建一個嵌套的文件夾,會發現比如將路徑改為./a/b/c,這樣是不行的,那如何創建呢,可以使用遞歸,當然不用我們直接寫,只需要添加第二個參數即可,代碼如下:

const fs = require('fs')// 創建嵌套文件夾
fs.mkdirSync('./a/b/c', {recursive: true
})

3.刪除

? ? ? ? 這個比較簡單,使用rm方法,命名跟Linux差不多。代碼如下:

const fs = require('fs')// 刪除
fs.rmSync('./a', {recursive: true
})

? ? ? ? 如果是嵌套的文件夾,只需要遞歸刪除即可。

4.重命名

const fs = require('fs')// 重命名
fs.renameSync('./a.txt', './b.txt')

? ? ? ? 第一個參收是需要重命名文件名稱,第二個參數是要修改的名稱。

5.監聽文件的變化

? ? ? ? 使用watch方法,許多熱更新的底層原來就用到了這個。代碼如下:

const fs = require('fs')// 監聽文件的變化
fs.watch('./a.txt', (event, filename) => {console.log(event, filename);
})

? ? ? ? 當我修改a.txt中的內容時,這個事件就會觸發

6.寫入文件

? ? ? ? 使用writeFile或writeFileSync方法,代碼如下:

const fs = require('fs')// 寫入文件
fs.writeFileSync('./a.txt', '666')

? ? ? ? 當運行腳本會發現,它會將原來文本里面的內容替換成我們寫入的內容,而不是追加,接下來就來說追加的操作。

7.追加寫入文件

1.第一種方法(writeFileSync)

? ? ? ? 寫入的方法也有追加的功能,添加第三個參數,代碼如下:

const fs = require('fs')// 追加文件
fs.writeFileSync('./a.txt', '\n777', {flag: 'a'
})

? ? ? ? a的意思是append追加的意思

2.第二種方法(appendFileSync)

const fs = require('fs')// 追加文件
fs.appendFileSync('./a.txt', '\n888')

8.可寫流

? ? ? ? 從名字可以看出和可讀流類似,可以回顧一下可讀流的意思就可以大致猜到可寫流是什么意思。

? ? ? ? 可寫流的意思就是將大量的數據分批插入。

const fs = require('fs')// 可寫流const writeStream = fs.createWriteStream('./a.txt')const data = ["青山銜落日,","碧水映霞飛。","風過荷香漫,","蟬鳴暮色微。","孤舟橫野渡,","倦鳥宿林扉。","欲寄鄉思遠,","星河入夢歸。"
]data.forEach(item => {writeStream.write(item + '\n')
})// 記得關閉 不然通道一直打開
writeStream.end()// 也可以添加事件 就比如通知寫入完成
writeStream.on('finish',() => {console.log('寫入完成');
})

結語:

????????Node.js的fs模塊為開發者提供了強大而靈活的文件系統操作能力,覆蓋從基礎讀寫到高級流處理的各類場景。通過同步、異步和Promise三種模式,開發者可根據項目需求選擇最佳實踐方式,平衡代碼可讀性與性能要求。

????????文件流處理技術(可讀流/可寫流)尤其適合大文件操作場景,有效避免內存壓力。目錄創建與刪除的遞歸選項、文件監聽機制等特性,為構建自動化工具和實時系統提供了底層支持。

????????現代JavaScript開發中,建議優先考慮Promise-based API或異步模式,結合錯誤處理機制構建健壯的應用。掌握這些核心方法后,開發者可以高效實現配置文件管理、日志系統、數據持久化等關鍵功能,為復雜Node.js應用奠定堅實基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87679.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HarmonyOS學習2---Stage模型

1、工程目錄結構 1.1、入口 UIAbility 1.2、入口page 1.3、配置文件 1、配置文件 1)應用級配置文件 --- app.json5 2)模塊級配置文件 --- module.json5 3、oh-package.json5 4、資源文件 1)element目錄 2)media目錄 3&#xff09…

【軟件工程】軟件復刻項目的完整流程指南

軟件復刻項目的完整流程指南 第一章、概述 一、前期準備:明確目標與合規性 1. 法律風險評估 版權排查:確認目標軟件的 UI 設計、代碼、商標是否受保護(如界面元素、核心算法是否申請專利)。規避侵權:避免直接復制 …

淺談Python 中的當前工作目錄與腳本目錄

Python 中的 os.path.exists() 和 __file__ 使用陷阱:工作目錄 ≠ 腳本目錄 在使用 os.path.exists() 或 open() 等函數操作文件路徑時,筆者常常忽略一個關鍵概念:當前運行目錄(Current Working Directory, CWD)并不等…

iOS檢測并阻止騷擾電話的方法

檢測并阻止騷擾電話 你可以在 iPhone 上使用“將未知來電者設置為靜音”或第三方 App 來阻止騷擾電話。 打開“將未知來電者設置為靜音” 在 iOS 13 及更高版本中,你可以打開“靜音未知來電”,以免接到陌生人的來電。這一功能可以阻止那些你從未聯系過…

TensorFlow源碼深度閱讀指南

TensorFlow源碼深度閱讀指南 本文基于《TensorFlow內核剖析》附錄A的代碼閱讀方法論,結合實例解析核心源碼閱讀技巧(含關鍵圖示):一、源碼閱讀的四個維度 1. 分層切入策略(圖A-1) #mermaid-svg-ooLMzaWU5ky…

設計模式-責任鏈模式、策略模式

責任鏈模式 Chain of Responsibility(職責鏈)—對象行為型模式定義:使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象…

泛微e-cology remarkOperate遠程命令執行漏洞

【高危】泛微e-cology remarkOperate遠程命令執行漏洞 漏洞描述 泛微e-cology是泛微公司開發的協同管理應用平臺。 受影響版本中,接口 /api/workflow/reqform/remarkOperate 存在 SQL 注入漏洞,multipart 類型參數 requestid 直接拼接進 SQL 語句&…

Redis常用操作

1:redis常用操作: package com.shunaier.hhhh.biz.utils;import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.shunaier.hhhh.common.enums.SystemErrorEnum; import com.shunaier.hhhh.common.exception.SNEB…

mybatis-plus-01-環境初始化及簡單應用

文章目錄 【README】【1】springboot集成mybatis-plus配置【1.1】目錄結構【相關說明】 【1.2】代碼示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表語句】 【2】演示 【README】 本文代碼參見&…

VR小鼠解剖虛擬仿真:開啟生命科學教育新視野?

VR 小鼠解剖虛擬仿真,是一項將虛擬現實(VR)技術深度融入小鼠解剖學習與研究過程的創新應用,即 VR 小鼠解剖虛擬仿真。其核心原理在于,借助 VR 技術所構建的高度逼真的虛擬環境,突破了傳統小鼠解剖在時間、空間以及實體操作上的諸多…

計算機網絡(網頁顯示過程,TCP三次握手,HTTP1.0,1.1,2.0,3.0,JWT cookie)

前言 最近一直在后端開發的面經🙌,里面涉及到了好多計算機網絡的知識😁,在這里以問題的形式寫一個學習筆記(其中參考了: JavaGuide 和 小林coding 這兩個很好的學習網站😘) 1.當鍵入網址后&am…

Redis 消息的發布和訂閱

Redis 消息的發布和訂閱 1、什么是發布和訂閱 Redis 發布訂閱 (pub/sub) 是一種消息通信模式:發送者 (pub) 發送消息,訂閱者 (sub) 接收消息。 Redis 客戶端可以訂閱任意數量的頻道。 2、Redis的發布和訂閱示意 1、客戶端可以訂閱頻道如下圖 2、當…

python優先隊列使用

heapq 是 Python 的一個內置模塊,提供了堆隊列算法的實現,也稱為優先隊列算法。以下是關于 heapq 模塊的詳細使用說明。 基本概念 堆:一種特殊的二叉樹結構,滿足父節點總是小于或等于其子節點(最小堆)特性…

在 Windows 機器上安裝和配置 RabbitMQ

RabbitMQ 它是一款基于 AMQP(高級消息隊列協議)的流行消息代理。RabbitMQ 適用于 Windows、Linux 和 macOS,易于安裝和使用,并提供一系列強大的消息隊列和路由功能。要在 Windows 計算機上使用 RabbitMQ,您必須先安裝 …

第十五節:第六部分:日志技術:logback的核心配置文件詳解、日志級別

核心配置文件logback.xml 什么是日志級別,為什么要學日志級別

從入門到精通:數據庫全攻略

目錄一、數據庫基礎概念1.1 數據庫定義1.2 數據庫與文件系統的區別1.3 數據庫系統組成部分1.4 關系型數據庫與非關系型數據庫二、數據庫安裝與配置2.1 下載 MySQL2.2 安裝 MySQL2.3 初始化數據庫服務器2.4 啟動和停止 MySQL 服務2.5 登錄 MySQL2.6 創建數據庫2.7 創建數據表三、…

【JAVA】消息隊列(MQ)是個好東西

一、前言再JAVA系統開發中,再高并發的場景經常需要使用到消息隊列,有時候是不得不使用到消息對了。特別是大數據量的并發處理。對數據實時性要求又沒那么高的情況下。用戶請求 → 接入層(Nginx) → 限流 → 消息隊列 → 訂單服務 → 庫存服務 → 支付服務…

【Golang面試題】Go結構體的特點,與其它語言的區別

Go 結構體深度解析:與 C/C、Java 的全面對比 一、核心概念對比特性Go 結構體 (struct)C/C 結構體 (struct)Java 類 (class)本質值類型復合數據類型值類型復合數據類型引用類型內存分配棧或堆 (編譯器決定)棧 (顯式控制)堆 (JVM管理)默認訪問權限首字母大寫導出publi…

CppCon 2018 學習:OOP is dead, long live Data-oriented design

探討了面向對象編程(OOP)的一些根本性問題深入理解: 標題:What is so wrong with OOP? 什么是面向對象的問題? 這不是說 OOP “絕對錯誤”,而是指出它在實踐中經常引發的問題,尤其是在性能敏…

科學的第五范式:人工智能如何重塑發現之疆

在人類探索未知的壯闊史詩中,科學方法的演進如同照亮迷霧的燈塔。從基于經驗的第一范式(描述自然現象),到以理論推演為核心的第二范式(牛頓定律、麥克斯韋方程),再到以計算機模擬為標志的第三范…