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的文件讀取方法應用~





留言
avatar-img
留言分享你的想法!
avatar-img
DDDDD的沙龍
15會員
37內容數
學涯無止境,透過每日or每週模仿學習筆記,不管是哪些領域也好,總有一天也可以從菜雞變小雞
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
專案產生大量又瑣碎的作業做處理,眼下要從iReport的設定檔(jrxml)擷取每一項套印參數出來,提供給別人做Excel公式的資料表進行作業。
Thumbnail
底下是HTML的上傳檔案程式碼: <form action="upload.php" method="post" enctype="multipart/form-data"> 選擇檔案: <input type="file" name="file"/><hr/> <input typ
Thumbnail
底下是HTML的上傳檔案程式碼: <form action="upload.php" method="post" enctype="multipart/form-data"> 選擇檔案: <input type="file" name="file"/><hr/> <input typ
Thumbnail
檔案屬性 filetype(string):回傳參數檔案的種類字串,可能的回傳值有:fifo、char、dir、block、link、file和unknown,如果有錯誤回傳false。 fileatime(string):回傳參數檔案的最後存取時間,單位是UNIX的時間戳記,如果錯誤回傳fal
Thumbnail
檔案屬性 filetype(string):回傳參數檔案的種類字串,可能的回傳值有:fifo、char、dir、block、link、file和unknown,如果有錯誤回傳false。 fileatime(string):回傳參數檔案的最後存取時間,單位是UNIX的時間戳記,如果錯誤回傳fal
Thumbnail
檔案存取 路徑與檔案處理是很常用的功能,他們可以獨立運作,但是常常搭配一起使用,如果你處理的檔案是在當下的目錄,可以不需要使用路徑的功能單獨讀寫檔案,如果是想要做一些資料夾的管理,就需要理解路徑和檔案之間的關係。
Thumbnail
檔案存取 路徑與檔案處理是很常用的功能,他們可以獨立運作,但是常常搭配一起使用,如果你處理的檔案是在當下的目錄,可以不需要使用路徑的功能單獨讀寫檔案,如果是想要做一些資料夾的管理,就需要理解路徑和檔案之間的關係。
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
NodeJS 學習來到 file systems 操作,在文檔操作上有分為同步跟異步的處理,接下來分階段介紹操作函數
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
👨‍💻 簡介 今天快速介紹一下對檔案的操作所使用的package os,包括檔案和資料夾操作等。 檔案和資料夾操作 os package 可以執行各種檔案和資料夾操作,如建立、讀取、寫入、刪除檔案,以及取得資料夾內容等。
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
Thumbnail
這篇想來寫,剛碰到js得時候,為了讓程式可以運作而安裝Node.js 。Node.js 是能夠在伺服器上面運行 JavaScript 的應用平台環境,透過 Node.js 提供的函式庫與執行環境能完成伺服器端服務。此篇幅就直接從純後端的角度切入摟(對不起拉我寫來寫去還是不知道怎麼順順的寫好文章開頭Q
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News