Node.js stream 流的簡單認識

xieshuning發表於2018-02-03

流的概念

流(stream)在 Node.js 中是處理流資料的抽象介面。在一個應用程式中,流是一組有序的、有起點和終點的位元組資料的傳輸手段。

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

  • Readable - 可讀流 (例如 fs.createReadStream()).
  • Writable - 可寫流 (例如 fs.createWriteStream()).
  • Duplex - 可讀可寫流 (例如 net.Socket).
  • Transform - 操作寫資料,然後讀取結果 (例如 zlib.createDeflate()).

可讀流 Readable:

fs.ReadStream 類,實現了 stream.Readable 介面的物件,將物件資料讀取為流資料。

使用ReadStream物件讀取檔案:

在fs模組中,可以使用 createReadStream 方法建立一個將檔案內容讀取為流資料的 ReadStream 物件。

fs.createReadStream(path,[options])

  • path:被讀取的檔案的完整路徑和檔名

  • options 可使用屬性,包括 flags,encoding,start,end, highWaterMark

    flags 開啟檔案要做的操作,預設為'r'

    encoding 預設為null

    start 開始讀取的索引位置

    end 結束讀取的索引位置(包括結束位置)

    highWaterMark 讀取快取區預設的大小64kb

簡單使用:

var fs = require('fs');
var file = fs.createReadStream('test.txt', {start: 3, end: 6});
file.on('open', function(){
    console.log('開始讀檔案');
});
file.on('data', function(data){
   console.log(data); 
});
file.on('end', function(data){
    console.log('檔案讀取已完成');
});
file.on('close', function(){
    console.log('檔案關閉');
});
file.on('error', function(err){
    console.log('檔案讀取失敗');
});
複製程式碼

可寫流 Writable:

fs.WriteStream 類,實現了 stream.Writable 介面的物件,將流資料寫入到物件中。

使用 WriteStream 物件寫入檔案:

fs.createWriteStream(path,[options])

  • path:被讀取的檔案的完整路徑和檔名

  • options 可使用屬性,包括 flags,encoding, highWaterMark

    flags 開啟檔案要做的操作,預設為'w'

    encoding 預設為utf8

    highWaterMark 寫入快取區的預設大小16kb

簡單使用:

var fs = require('fs');
var file = fs.createReadStream('test.txt');
var out = fs.createWriteStream('test02.txt');
file.on('data', function(data){
    out.write(data);
});
out.on('open', function(){
    console.log('被寫入檔案已開啟');
});
file.on('end', function(){
    out.end('end',function(){
        console.log('檔案寫入完畢');
    })
})
複製程式碼

可讀可寫流 Duplex

Duplex 流,也稱為雙工流,是同時實現了 Readable 和 Writable 介面的流,可以在統統一個物件上同時可讀可寫。

Duplex 流的例項包括了:

TCP sockets 網路模組

zlib streams 壓縮和解壓縮模組

crypto streams 加密模組

轉換流 Transform

Transform streams 是一種 Duplex 流,它的輸出是從輸入中計算出來的。

Transform 流的例項包括:

zlib streams 壓縮和解壓縮模組

crypto streams 加密模組


^_^ 感謝瀏覽,以上是自己對 stream 的一些粗淺認知,後續會繼續補充。

參考:node.js 中文網

相關文章