NodeJS 關於 file systems,FS異步同步檔案寫入及讀取操作

閱讀時間約 11 分鐘

NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數

FS 異步寫入

//異步寫入文件 
fs.writeFile(file, data[, options], callback)

參數使用說明如下:

  • file:檔案名稱或檔案描述符。
  • data:要寫入檔案的數據,可以是 String(字串) 或 Buffer(緩衝) 物件。
  • options:此參數是一個對象,包含 {encoding, mode, flag}。 預設編碼為 utf8, 模式為 0666 , flag 為 'w'。
  • callback:回呼函數,回呼函數只包含錯誤訊息參數(err),寫入失敗時回傳。
// 如果文件不存在則直接創建,options 第三個參數為一個可選參數,這邊不寫
// 直接寫回調函數 callback

//導入fs 模塊
const fs = require('fs');

// 導入fs 模塊
const fs = require('fs');

// 寫入文件
fs.writeFile('./123.txt', 'test_test', err => {
if(err){
console.log('寫入失敗');
return;
}
console.log('寫入成功');
})

而在異步處理下會先執行主要的JS線程,而到檔案做寫入時是走IO線程,故為異步操作, 而主線程不等待回調結果,直接往下執行,我們試著在最後增加一個 console.log(1+1); 驗證流程結果

// 如果文件不存在則直接創建,options 第三個參數為一個可選參數,這邊不寫
// 直接寫回調函數 callback

//導入fs 模塊
const fs = require('fs');

// 導入fs 模塊
const fs = require('fs');

// 寫入文件
fs.writeFile('./123.txt', 'test_test', err => {
if(err){
console.log('寫入失敗');
return;
}
console.log('寫入成功');
})

console.log(1+1);
raw-image

而整個執行,會是如下圖所示,故異步執行效率會較高

raw-image

FS 同步寫入

//同步寫入文件,差別無回調函數 
fs.writeFileSync(filename, data[, options])

// 同步寫入文件
fs.writeFileSync('./456.text', 'testSync')

參數使用說明如下:

  • file:檔案名稱或檔案描述符。
  • data:要寫入檔案的數據,可以是 String(字串) 或 Buffer(緩衝) 物件。
  • options:此參數是一個對象,包含 {encoding, mode, flag}。 預設編碼為 utf8, 模式為 0666 , flag 為 'w'。

同步寫入的操作,主要是由JS主線程執行然後送到IO線程處理,等待處理完畢後再寫回,才由主線程繼續執行,處理方式無異步效率高。​

FS異步追加寫入

接下來說明當文件寫入一半,需要持續寫入的時候的應用,這時候可以使用file systems下的appendFile去讀取文件並將資料寫入

//异步追加文件内容
fs.appendFile(filename, data[, options], callback)

//異步追加寫入
fs.appendFile('./123.txt', ',這是要追加的內容', err => {
if(err){
console.log('寫入失敗');
return;
}
console.log('追加寫入成功');
});

第一個參數選擇要寫入的檔案名稱,第二個參數帶入要追加的文檔,在包含一個回調函數。

FS同步追加寫入

如果寫入想要要換行,在JS裡面是使用\r\n

//同步追加文件内容
fs.appendFile. fs.appendFileSync(filename, data[, options])

//同步追加寫入
fs.appendFileSync('./456.text', 'testSync追加的內容')

//同步追加寫入
fs.appendFileSync('./456.text', '\r\ntestSync追加的內容')

而如果使用上面原本的fs.writeFile想作為追加寫入的行為,可以在option參數加上 {flag: 'a'},即可實現追加寫入


//異步寫入文件仿照追加寫入
fs.writeFile('./123.txt', 'yoyo', {flag: 'a'}, err => {
if(err){
console.log('寫入失敗');
return;
}
console.log('寫入成功');
});

而這裡的flag: 'a'主要是append的意思,即是打開文件進行寫入的操作,這表示當文件已存在,則新的數據將會追加到文件的末尾,而不是覆蓋原有內容。

而option其他參數可以參考以下

raw-image

FS流式寫入

這邊講解FS流式寫入使用createWriteStream方法。

fs.createWriteStream(path[, options])

createWriteStream 與 writeFile 差異在於writeFile一次性處理完畢後就斷開連接通道,而createWriteStream會持續連接通道直到關閉,而適合持續寫入的場景,writeFile則適合寫入較少的場景。

// 導入fs 模塊 
const fs = require('fs');

// 1.創建寫入流
const ws = fs.createWriteStream('./789.txt');

// 2. write
ws.write('123');
ws.write('456');
ws.write('789');
ws.write('101112');

// 3. 關閉通道
ws.close(); //這個步驟為可選,因為正常在寫入完成後,資源將會被釋放出來而斷開


FS文件讀取

在 file systems文件讀取也分為異步fs.readFile()及同步fs.readFileSync()

//異步讀取文件​
fs.readFile(filename[, options], callback)

//同步讀取文件​
fs.readFileSync(filename[, options])

而fs.readFile 的callback function 有兩個參數

// 導入fs 模塊 
const fs = require('fs');

// 異步讀取
fs.readFile('./123.txt', (err, data) => {
if(err){ console.log('寫入失敗');
return;
}

console.log(data); }); // err 作為錯誤訊息的回調,data 為接收讀取資料的結果
raw-image

這邊可以看到讀取到的內容是一個 buffer ,而需要知道實際內容可以透過toString()方法將buffer轉成字串。


// 導入fs 模塊
const fs = require('fs'); // 異步讀取
fs.readFile('./123.txt', (err, data) => {
if(err){ console.log('寫入失敗');
return;
}

console.log(data.toString());
raw-image

而如果是使用同步讀取的方式,只要帶入文件路徑即可

// 同步讀取 
let data = fs.readFileSync('./123.txt');
console.log(data.toString());
raw-image

FS流式讀取

流式讀取主要是切割多個chunk 一次讀取一個chunk執行,在實際應用上讀取大型文件時可以提高讀取效率。

fs.createReadStream(path[, options])

在讀取文件後回調函數的執行,是當讀取一塊數據就會執行一次回調,這邊創建讀取一個mp4的檔案,綁定一個data事件並console.log(chunk)看看結果。

// 導入fs 模塊 
const fs = require('fs');

// 創建讀取流對象
const rs = fs.createReadStream('./video.mp4');

// 綁定data事件
rs.on('data', chunk => { console.log(chunk) })
raw-image

而我們可以透過使用lenght來知道獲取buffer的長度,可以打印出來後看到每一次切割為65536 => 64KB => 表示一次讀取一個64KB的 chunk

// 導入fs 模塊 
const fs = require('fs');

// 創建讀取流對象
const rs = fs.createReadStream('./video.mp4');

// 綁定data事件
rs.on('data', chunk => { console.log(chunk.length)
raw-image

而使用上在讀取流中執行,通常會觸發一個end事件,而這個事件是可選的,可加可不加

// 導入fs 模塊
const fs = require('fs');

// 創建讀取流對象
const rs = fs.createReadStream('./video.mp4');

// 綁定data事件
rs.on('data', chunk => {
console.log(chunk.length)
})

// end
rs.on('end', () => {
console.log('讀取完成');
})
raw-image





小結:以上就是關於 file systems 對於檔案的寫入操作,下一篇就要說明關於file systems的文件讀取方法應用~





15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
留言0
查看全部
發表第一個留言支持創作者!
DDDDD的沙龍 的其他內容
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
NodeJS作用? NodeJS 作為一個後端程式語言,與伺服器交互,能夠開發服務器應用、開發工具類應用,例如:Webback、Vite 這些好用工具,或是透過NodeJS的electron框架開發桌面端應用,而常見的桌面端應用如 VScode
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Express 是一個簡潔而靈活的 Node.js 網頁應用程式框架,本文將介紹 Express 的基礎知識,包括安裝、路由設定、中介層使用,以及如何搭配 EJS 模板引擎來渲染動態內容。
Thumbnail
咦!奇怪, 怎麼網頁用一用就出現以下的畫面了, 到底是怎麼回事啊? 不用慌張, 讓我們仔細看看中間的「HTTP ERROR 431」,看到這樣的錯誤代碼, 相信心中隱約已經知曉我們的請求標頭內容太大了, 超過限制導致這樣的問題發生, 讓我們先詳細查閱這樣的錯誤訊息吧! 📚 https://
Thumbnail
安裝完成 nodejs 後選用一個工作目錄執行 npm init,npm 會產生一個 package.json 檔案,之後為此專案安裝套件時都會記錄在此,讓專案可以很容易的重建和移植,也可設定 npm start 執行時以哪一個 js 檔當作系統入口。直接開寫了,以下我用 app.js 當作系統入口
Thumbnail
嗨,你有沒有想過用 ChatGPT 來減少 DevOps 工作? 今天我將向您展示如何使用 ChatGPT 減少 NodeJS 網絡應用程式的鏡像大小。 您會驚訝於 ChatGPT 如何能夠在短短幾分鐘內輕鬆生成一個無錯誤的 Docker 文件,來優化 Node.js docker 映像的大小。
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
Thumbnail
由於Javascript本身設計就適合於單線程的應用, 但一般後端應用程式都會支援多個服務來處理client的請求, nodejs中也提供了cluster模組來達成此功能。 Cluster的原理很簡單,由於每個Process都只能用單核心的CPU來運行,那麼就多開幾個來幫忙處理吧! 而這個Clust
Thumbnail
Firebase 推播訊息 的第二篇文章是在說明當 Firebase 專案建立完成之後,如何利用Nodejs和專案裡的金鑰將message推播出去 本篇會先介紹如何建立一個Nodejs專案,再介紹如何透過程式將訊息推播出去。 首先建立一個sendMsg的資料夾 2. 進入sendMsg 資料夾後執行
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
Express 是一個簡潔而靈活的 Node.js 網頁應用程式框架,本文將介紹 Express 的基礎知識,包括安裝、路由設定、中介層使用,以及如何搭配 EJS 模板引擎來渲染動態內容。
Thumbnail
咦!奇怪, 怎麼網頁用一用就出現以下的畫面了, 到底是怎麼回事啊? 不用慌張, 讓我們仔細看看中間的「HTTP ERROR 431」,看到這樣的錯誤代碼, 相信心中隱約已經知曉我們的請求標頭內容太大了, 超過限制導致這樣的問題發生, 讓我們先詳細查閱這樣的錯誤訊息吧! 📚 https://
Thumbnail
安裝完成 nodejs 後選用一個工作目錄執行 npm init,npm 會產生一個 package.json 檔案,之後為此專案安裝套件時都會記錄在此,讓專案可以很容易的重建和移植,也可設定 npm start 執行時以哪一個 js 檔當作系統入口。直接開寫了,以下我用 app.js 當作系統入口
Thumbnail
嗨,你有沒有想過用 ChatGPT 來減少 DevOps 工作? 今天我將向您展示如何使用 ChatGPT 減少 NodeJS 網絡應用程式的鏡像大小。 您會驚訝於 ChatGPT 如何能夠在短短幾分鐘內輕鬆生成一個無錯誤的 Docker 文件,來優化 Node.js docker 映像的大小。
Thumbnail
研究這個部分起因是因為公司某些功能服務是使用AWS Serverless來處理計算,故而外訂立了三個月學習NodeJS的計畫,並開始試著實作Serverless服務,Jest測試還沒研究到,下次再補充說明。
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這一篇文章,我想來談談模板語言(template language/engine)。而其中比較有名的為handlebar、pug、ejs。那我會的事後兩著,因此拿這兩個出來寫一篇文章。 Pug 指令:npm install pug 比起 HTML 的語法,pug 語法可以說簡潔很多。 那下面
一般來說我們如果將程式運行在console上,只要用ctrl + c 之類的強制中斷方式就能讓程式中止,但如果我們想要在程式運行到一半時,偵測到某些例外狀況就離開程式,可以怎麼做呢? nodejs核心模組提供了process.exit()的方法可以讓程式強制中止,但使用了這個功能之後,我們尚未完成的
Thumbnail
由於Javascript本身設計就適合於單線程的應用, 但一般後端應用程式都會支援多個服務來處理client的請求, nodejs中也提供了cluster模組來達成此功能。 Cluster的原理很簡單,由於每個Process都只能用單核心的CPU來運行,那麼就多開幾個來幫忙處理吧! 而這個Clust
Thumbnail
Firebase 推播訊息 的第二篇文章是在說明當 Firebase 專案建立完成之後,如何利用Nodejs和專案裡的金鑰將message推播出去 本篇會先介紹如何建立一個Nodejs專案,再介紹如何透過程式將訊息推播出去。 首先建立一個sendMsg的資料夾 2. 進入sendMsg 資料夾後執行