Node.js 筆記03
一、buffer(快取區)
Node裡面的buffer,是一個二進位制資料容器,資料結構類似與陣列,專門用於Node中資料的存放
1. buffer的基本使用
歷史上的使用方式:const buf1 = new Buffer(10);
這種方式存在安全隱患,即 分配到的記憶體可能還儲存著舊資料。
Buffer中儲存的都是二進位制資料,但是在顯示時都是以16進位制的形式顯示
Buffer.from(str) 將一個字串轉換為buffer
Buffer.alloc(size) 建立一個指定大小的Buffer
Buffer.allocUnsafe(size) 返回一個指定大小但未初始化的 Buffer
Buffer
是未初始化的,可能包含舊資料。
為了使
Buffer
例項的建立更可靠,new Buffer()
建構函式已被廢棄,建議使用Buffer.from()
、Buffer.alloc()
、和Buffer.allocUnsafe()
Buffer
的內容是未知的,可能包含敏感資料。 使用Buffer.alloc()
可以建立已初始化的Buffer
。
let str = '檢視工作流'; let buffer = Buffer.from(str); console.log(buffer); console.log(buffer.length); console.log(buffer.toString()); //輸出以十進位制輸出 // <Buffer e6 9f a5 e7 9c 8b e5 b7 a5 e4 bd 9c e6 b5 81> // 15 // 檢視工作流
let buffer = Buffer.alloc(10); console.log(buffer);//<Buffer 00 00 00 00 00 00 00 00 00 00> buffer[0] = 10; buffer[1] = 11; buffer[2] = 0XFC; buffer[9] = 9; buffer[10] = 20; // 這個數不會被新增進去 console.log(buffer);//<Buffer 0a 0b fc 00 00 00 00 00 00 09> console.log(buffer[1].toString(16)); // b buffer.forEach((item,index)=>{ console.log(index + ":" + item); //輸出是以十進位制輸出 }) /* 0:10 1:11 2:252 3:0 4:0 5:0 6:0 7:0 8:0 9:9 */
Buffer使用相關注意點:
Buffer的結構和陣列很像,操作的方法也和陣列類似
Buffer中是以二進位制的方式儲存資料的
Buffer是Node自帶,不需要引入,直接使用即可
二、檔案系統(File System)
1. 基本概念
在Node中,與檔案系統的互動是非常重要的,伺服器的本質就將本地的檔案傳送給遠端的客戶端, Node通過fs模組來和檔案系統進行互動,該模組提供了一些標準檔案訪問API來開啟、讀取、寫入檔案,以及與其互動。
- 要使用fs模組,首先要從核心模組中載入:
const fs = require("fs");
- fs模組中所有的操作都有兩種形式可供選擇同步和非同步。
- 同步檔案系統會阻塞程式的執行,也就是除非操作完畢,否則不會向下執行程式碼。
非同步檔案系統不會阻塞程式的執行,而是在操作完成時,通過回撥函式將結果返回。
2.檔案操作
開啟檔案
fs.open(path, flags[, mode], callback)
fs.openSync(path, flags[, mode])r 讀取檔案 , 檔案不存在則出現異常
r+ 讀寫檔案 , 檔案不存在則出現異常
rs 在同步模式下開啟檔案用於讀取
rs+ 在同步模式下開啟檔案用於讀寫
w 開啟檔案用於寫操作 , 如果不存在則建立,如果存在則截斷
wx 開啟檔案用於寫操作 , 如果 存在則開啟失敗
w+ 開啟檔案用於讀寫 , 如果不存在則建立 , 如果存在則截斷
wx+ 開啟檔案用於讀寫 , 如果 存在則開啟失敗
a 開啟檔案用於追加 , 如果不存在則建立
ax 開啟檔案用於追加 , 如果路徑存在則失敗
a+ 開啟檔案進行讀取和追加 , 如果不存在則建立該檔案
ax+ 開啟檔案進行讀取和追加 , 如果路徑存在則失敗
關閉檔案
fs.close(fd, callback)
fs.closeSync(fd)
// 1、引入模組
let fs = require('fs');
//2、開啟檔案
let fd = fs.openSync('a/1.txt','w');
console.log(fd); //3
// 3、寫入內容
fs.writeFileSync(fd,'nice day!');
// 4. 儲存並退出
fs.closeSync(fd);
console.log('hello');
//3
// hello
//使用的同步方法,所以先列印3,再列印hello
非同步方式:
// 1、引入模組
fs = require('fs');
// 2、開啟檔案
fs.open('a/2.txt','a',(err,fd)=>{
// 2.1 判斷是否有錯
if(!err){
// 2.2 寫入檔案
fs.writeFile(fd,'收費通知單\n',(err)=>{
// 2.3 檔案寫入成功
if(!err){
console.log('寫入檔案成功');
}else{
throw err;
}
// 2.4 關閉檔案
fs.close(fd,(err)=>{
if(!err){
console.log('檔案已經儲存並關閉');
}
})
})
}else {
throw err;
}
});
// 3.其他操作
console.log('其他操作');
/*
-----------執行結果----------
其他操作
寫入檔案成功
檔案已經儲存並關閉
*/
// 因為是非同步的,所以先執行的 其他操作,然後進行的寫入操作等。
關於寫入檔案:
fs中提供了四種不同的方式將資料寫入檔案
- 簡單檔案寫入
- 同步檔案寫入
- 非同步檔案寫入
- 流式檔案寫入
1. 簡單的檔案寫入
• fs.writeFile(file, data[, options], callback)
• fs.writeFileSync(file, data[, options])
引數:
– file 檔案路徑
– data 被寫入的內容,可以是String或Buffer
– options 物件,包含屬性(encoding、mode、flag)
– callback 回撥函式
2. 同步檔案寫入
• fs.writeSync(fd, buffer, offset, length[, position])
• fs.writeSync(fd, data[, position[, encoding]])
引數
– fd 檔案描述符,通過openSync()獲取
– data 要寫入的資料(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長度
– position 寫入的起始位置
– encoding 寫入編碼
注意: 要完成同步寫入檔案,先需要通過openSync()開啟檔案來獲取一個檔案描述符,然後在通過writeSync()寫入檔案。
3. 非同步檔案寫入
• fs.write(fd, buffer, offset, length[, position], callback)
• fs.write(fd, data[, position[, encoding]], callback)
引數:
– fd 檔案描述符
– data 要寫入的資料(String 或 Buffer)
– offset buffer寫入的偏移量
– length 寫入的長度
– position 寫入的起始位置
– encoding 寫入編碼
注意: 要使用非同步寫入檔案,先需要通過open()開啟檔案,然後在回撥函式中通過write()寫入。
4.流式檔案寫入
看下面的程式碼