David Yu Blog

Node.js | Buffer與Stream

Word count: 528Reading time: 2 min
2023/03/07

Buffer

Buffer(緩衝)是在資料移動時,提供資料暫存的記憶體位置,可以暫時的累積資料再繼續傳遞,就像在網路上看影片時,會有灰色區塊的緩衝暫存還沒播放到的影片資料。

在NodeJS中的緩衝,是以二進制資料(binary data)的形式暫存資料,可以透過函式如:fromtoString進行資料的解碼或編碼,支援的編碼包含常用的utf8ASCII等。

Buffer 在全域下不需要使用 require 就能使用。

new Buffer.from(字串,編碼)可以直接建立新的Buffer,在定義新的Buffer變數時,編碼預設為utf8

1
let buffer = new Buffer.from("Hello");		//編碼預設為utf8

Untitled

Stream

Stream(串流)指的是資料傳遞資料的序列流。

Untitled

在NodeJS中的Stream,作為EventEmitter的子類別,繼承了on()emit()等方法,而串流根據資料流向的方向不同又分成writable(寫入)、readable(讀取)、duplex(讀寫)、transform(轉換)等類型,每一個串流的類別都繼承串流的方法。從官方的文件也可以發現串流的類別是一個抽象/基底類別(abstract/base class),不會被直接使用,而是透過繼承取用的其屬性及方法,因此必須透過建立新的客製化物件再去繼承基底類別。

Untitled

實作

讀取資料,印出資料內容

在NodeJS中的fs模組提供了建立客製化Stream的功能,在讀取資料時,會先以Buffer的形式暫存。

使用on()註冊data事件,以監聽資料讀取的過程,而綁定該事件內容的函式,加入chunk作為讀取資料時的參數,chunk是串流中傳遞的資料片段,透過印出chunk可以確認資料讀取的情況。

1
2
3
4
5
6
7
8
9
10
11
12
let fs = require("fs");

let readable = fs.createReadStream(__dirname + "/stream.txt");

readable.on("data", function(chunk){
console.log(chunk);
});

let utf_readable = fs.createReadStream(__dirname + "/stream.txt", {encoding: "utf8"});
utf_readable.on("data", function(chunk){
console.log(chunk);
});

Untitled

總結

Buffer是暫存資料區塊,Stream像是資料傳輸的通道

CATALOG
  1. 1. Buffer
  2. 2. Stream
    1. 2.1. 實作
  3. 3. 總結