Node.js stream(流) 學習筆記(一)

smilebai發表於2018-06-05

1. 流的概念

流(stream)在 Node.js 中是處理流資料的抽象介面(abstract interface)。 stream 模組提供了基礎的 API 。使用這些 API 可以很容易地來構建實現流介面的物件。 stream模組可以通過以下方式引入: const stream = require('stream');

2.流的型別

Node.js中有四種基本的流型別

  • Readable - 可讀的流(例如fs.createReadStream()).
  • Writable - 可寫的流(例如fs.createWriteStream()).
  • Duplex - 可讀寫的流 (例如net.Socket).
  • Transform - 再讀寫過程中可以修改和變換資料的Duplex流(例如zlib.createDeflate()).

3.流中的資料有兩種模式,二進位制模式和物件模式

所有使用Node.js API 建立的物件都只能操作strings和Buffer(或 Uint8Array) 物件,但是通過第三方流的實現,你依然能夠處理其它型別的Javascript值,這些流被認為是工作在“物件模式”

4.緩衝

Writable和Readable流都會將資料儲存到內部的緩衝器(buffer)中。這些緩衝器可以通過相應的writable._writableState.getBuffer()或readable._readable.buffer來獲取 緩衝器的大小取決於傳遞給流建構函式的highWaterMark選項。對於普通的流,highWaterMark選項制定了總共的位元組數。對於工作在物件模式的流,highWaterMark指定流物件的總數

5.可讀流建立及監聽事件

所有的 Stream 物件都是 EventEmitter 的例項。常用的事件有:

  • data:當資料可讀時觸發
  • end: 沒有更多資料可讀時觸發
  • error: 在接收和寫入過程中發生錯誤時觸發
  • finish: 所有資料已被寫入到底層系統時觸發
下面寫一個例子,從流中讀取資料
var fs = require('fs');
var data = '';

//建立可讀流
var readerStream = fs.createReadStream('a.txt');

//設定編碼為utf8
readerStream.setEncoding('UTF8');

//處理流事件 data,end,error
readerStream.on('data',function(chunk){
    data += chunk;
});

readerStream.on('end',function(){
    console.log(data);
});
readerStream.on('error', function(){
    console.log(err.stack);
})
console.log('程式執行完畢')
複製程式碼

執行結果

程式執行完畢
hello world!
複製程式碼
寫入流-例子
var fs = require('fs');
var data = '學習node stream';

//建立一個可寫流
var wirteStream = fs.createWriteStream('b.txt');

//使用utf8編碼寫入資料
wirteStream.write(data,'UTF8');

//標記檔案末尾
wirteStream.end();

//處理流事件 data,end, error,finish
wirteStream.on('finish',function(){
    console.log('寫入完成');
})

wirteStream.on('error', function(err){
    console.log(err.stack)
})
console.log('程式執行完畢');
複製程式碼

執行結果

程式執行完畢
寫入完成
複製程式碼

開啟b.txt檢視,內容為

學習node stream
複製程式碼

(未完待續)

相關文章