1. 程式人生 > >Nodejs 流的操作

Nodejs 流的操作

 

Stream(流)

  簡介

       Stream是一個抽象介面,所有的Stream都是EventEmitter的例項,Stream有四種類型:

  1. Readable 可讀
  2. Writeable 可寫
  3. Duplex 可讀可寫操作
  4. Transform 操作被寫入資料、然後讀出結果

 

  常用事件

  1. data—有資料可讀時觸發
  2. end—沒有資料可讀時觸發
  3. error—在接受或寫入過程中發生錯誤
  4. finish—所有資料被寫入到底層系統時觸發

 

 

   讀/寫資料

              讀取

                     例項

var fs =  require("fs");
var
data = '';

var

rs = fs.createReadStream("E:/for_file/6.txt");
rs.setEncoding('UTF8');
rs.on('data',function (content) {
    data += content;
});


rs.on('end',function () {
   console.log(data);
});

rs.on('error',function (err) {
   console.log(err.stack);
});

console.log("over");

                     執行結果:

             

var readerStream = fs.createReadStream('路徑');

讀取檔案內容:

                     如果可讀:data = data+content(讀取到的檔案內容);

                     如果無資料可讀:輸出data

 

            寫入

            例項

var fs =  require("fs");
var
data = '一個人至少擁有一個夢想,有一個理由去堅強。心若沒有棲息的地方,到哪裡都是在流浪。';

var
ws = fs.createWriteStream('E:/for_file/6.txt');
ws.write(data,'UTF8');//按照utf8編碼寫入資料
ws.end();//標記末尾

ws.on('finish',function () {
   console.
log("over");
});

ws.on('error',function (e) {
    console.
log(e.stack);
});

console.log("finish");

            執行結果:

            createWriteStream()按照路徑建立一個檔案

              監聽finish和error事件

 

 管道流

  1. 首先執行 readbable.pipe(writable),將 readable 與 writable 對接上
  2. 當 readable 中有資料時,readable.emit('data'),將資料寫入 writable
  3. 如果 writable.write(chunk) 返回 false,則進入 pause 模式,等待 drain 事件觸發
  4. drain 事件全部觸發後,再次進入 flow 模式,寫入資料
  5. 不管資料寫入完成或發生中斷,最後都會呼叫 unpipe()
  6. unpipe() 呼叫 Readable.prototype.unpipe(),觸發 dest 的 unpipe 事件,清理相關資料

 

例項

var fs = require("fs");
var
rs = fs.createReadStream("E:/for_file/6.txt");
var
ws = fs.createWriteStream("E:/for_file/7.txt");

rs.pipe(ws);
console.log("over");

 

執行結果:

 

 

鏈式流

        連線readerStream和writeStream並進行操作

 

例項

var fs = require('fs');
var
zlib = require('zlib');

fs.createReadStream('E:/for_file/6.txt')
  .
pipe(zlib.createGzip())
    .
pipe(fs.createWriteStream('E:/for_file/7.txt.gz'));

console.log("ovre");

 

執行結果:

 


var fs = require("fs");
var
zlib = require('zlib');

// 壓縮 input.txt 檔案為 input.txt.gz
fs.createReadStream('E:/for_file/6.txt.gz')
    .
pipe(zlib.createGunzip())
    .
pipe(fs.createWriteStream('E:/for_file/7.txt'));

console.log("檔案解壓完成。");

執行結果: