Node.js中的緩衝與流模組詳細介紹_node.js
緩衝(buffer)模組
js一開始就是為瀏覽器而設計的,所以能很好的處理unicode編碼的字串,但不能很好的處理二進位資料。這是Node.js的一個問題,因為Node.js旨在網路上發送和接收經常是以二進位格式傳輸的資料。如:
- 透過TCP連線發送和接收資料;
- 從影像或壓縮檔案讀取二進位資料;
- 從檔案系統讀寫資料;
- 處理來自網路的二進位資料流
而Buffer模組為Node.js帶來了一種儲存原始資料的方法,於是可以再js的上下文中使用二進位資料。每當需要在Node.js中處理I/O操作中移動的資料時,就有可能使用Buffer模組。
類別:Buffer
Buffer 類別是一個全域變數類型,用來直接處理2進位資料的。 它能夠使用多種方式建構。
原始資料保存在 Buffer 類別的實例中。一個 Buffer 實例類似一個整數數組
1.new Buffer(size):分配一個新的 buffer 大小是 size 的8位元組.
2.new Buffer(array):分配一個新的 buffer 使用一個8位元組 array 數組.
3.new Buffer(str, [encoding]):encoding String類型 - 使用什麼編碼方式,參數可選.
4.類別方法: Buffer.isEncoding(encoding):如果給定的編碼 encoding 是有效的,則傳回 true,否則傳回 false。
5.類別方法: Buffer.isBuffer(obj):測試這個 obj 是否是一個 Buffer. 回傳Boolean
6.類別方法: Buffer.concat(list, [totalLength]):list {Array}陣列類型,Buffer數組,用於被連接。 totalLength {Number}類型 上述Buffer數組的所有Buffer的總大小。
除了可以讀取檔案得到Buffer的實例外,還能夠直接構造,例如:
var bin = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]);
Buffer與字串類似,除了可以用.length屬性得到位元組長度外,還可以用[index]方式讀取指定位置的位元組,例如:
bin[0]; // => 0x48;
Buffer與字串能夠互相轉化,例如可以使用指定編碼將二進位資料轉化為字串:
var str = bin.toString('utf-8'); // => "hello"
.slice方法不是傳回一個新的Buffer,而更像是傳回了指向原Buffer中間的某個位置的指針,如下所示。
1.[ 0x48, 0x65, 0x6c, 0x6c, 0x6c ]
2. ^ ^
3. | |
4. bin bin.slice(2)
寫入緩衝區
var buffer = new Buffer(8);//建立一個分配了8個位元組記憶體的緩衝區
console.log(buffer.write('a','utf8'));//輸出1
這會將字元"a"寫入緩衝區,node傳回經過編碼以後寫入緩衝區的位元組數量,這裡的字母a的utf-8編碼佔用1個位元組。
複製緩衝區
Node.js提供了一個將Buffer物件整體內容複製到另一個Buffer物件中的方法。我們只能在已經存在的Buffer物件之間複製,所以必須建立它們。
buffer.copy(bufferToCopyTo)
其中,bufferToCopyTo是要複製的目標Buffer物件。如下範例:
var buffer1 = new Buffer(8);
buffer1.write('nice to meet u','utf8');
var buffer2 = new Buffer(8);
buffer1.copy(buffer2);
console.log(buffer2.toString());//nice to meet u
流模組
在UNIX類型的作業系統中,流是個標準的概念。有以下三個主要的流:
1.標準輸入
2.標準輸出
3.標準錯誤
可讀流
如果說,緩衝區是Node.js處理原始資料的方式的話,那麼流通常是Node.js移動資料的方式。 Node.js中的流是可讀的或可寫的。 Node.js中許多模組都使用了流,包括HTTP和檔案系統。
假設我們建立一個classmates.txt的文件,並從中讀入姓名清單,以便使用這些資料。由於資料是流,這意味著完成檔案讀取之前,從收到最初幾個位元組開始,就可以對資料動作,這是Node.js中的一個常見模式:
var fs = require('fs');
var stream = fs.ReadStream('classmates.txt');
stream.setEncoding('utf8');
stream.on('data', function (chunk) {
console.log('read some data')
});
stream.on('close', function () {
console.log('all the data is read')
});
在上述範例中,在收到新資料時觸發事件資料。當文件讀取完成後觸發關閉事件。
可寫流
顯然,我們也可以建立可寫流以便寫資料。這意味著,只要一段簡單的腳本,就可以使用流讀入檔案然後寫入另一個檔案:
var fs = require('fs');
var readableStream = fs.ReadStream('classmates.txt');
var writableStream = fs.writeStream('names.txt');
readableStream.setEncoding('utf8');
readableStream.on('data', function (chunk) {
writableStream.write(chunk);
});
readableStream.on('close', function () {
writableStream.end();
});
現在,當接收到資料事件時,資料會被寫入可寫流中。
readable.setEncoding(encoding):回傳: this
readable.resume():同上。此方法讓可讀流繼續觸發 data 事件。
readable.pause():同上。此方法會使一個處於流動模式的流停止觸發 data 事件,切換到非流動模式,並讓後續可用資料留在內部緩衝區。
類別: stream.Writable
Writable(可寫入)流介面是對您正在寫入資料至一個目標的抽象化。
1.writable.write(chunk, [encoding], [callback]):
chunk {String | Buffer} 要寫入的資料
encoding {String} 編碼,假如 chunk 是一個字串
callback {Function} 資料塊寫入後的回呼
傳回: {Boolean} 如果資料已全部處理則 true。
此方法向底層系統寫入數據,並在資料處理完畢後呼叫所給予的回調。
2.writable.cork():強行滯留所有寫入。
滯留的資料會在 .uncork() 或 .end() 呼叫時寫入。
3.writable.end([chunk], [encoding], [callback])
chunk {String | Buffer} 可選,要寫入的資料
encoding {String} 編碼,假如 chunk 是一個字串
callback {Function} 可選,流結束後的回呼
在呼叫 end() 後呼叫 write() 會產生錯誤。
// 寫入 'hello, ' 然後以 'world!' 結束
http.createServer(function (req, res) {
res.write('hello, ');
res.end('world!');
// 現在不允許繼續寫入了
});

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這篇文章將為大家詳細講解有關PHP將行格式化為CSV並寫入文件指針,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。將行格式化為CSV並寫入檔案指標步驟1:開啟檔案指標$file=fopen("path/to/file.csv","w");步驟2:將行轉換為CSV字串使用fputcsv( )函數將行轉換為CSV字串。此函數接受以下參數:$file:檔案指標$fields:作為陣列的CSV欄位$delimiter:欄位分隔符號(可選)$enclosure:欄位引號(

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

Node 19已正式發布,以下這篇文章就來帶大家詳解了解Node.js 19的 6 大特性,希望對大家有幫助!

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

事件循環是 Node.js 的基本組成部分,透過確保主執行緒不被阻塞來實現非同步編程,了解事件循環對建立高效應用程式至關重要。以下這篇文章就來帶大家深入了解Node中的事件循環 ,希望對大家有幫助!

如何用pkg打包nodejs可執行檔?以下這篇文章跟大家介紹一下使用pkg將Node專案打包為執行檔的方法,希望對大家有幫助!
