1. 程式人生 > >Node.js 筆記03

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. 簡單檔案寫入
  2. 同步檔案寫入
  3. 非同步檔案寫入
  4. 流式檔案寫入
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.流式檔案寫入
  看下面的程式碼