1. 程式人生 > >nodejs中的stream模組的認識與使用

nodejs中的stream模組的認識與使用

對於stream模組我也是初步的認識,並沒有做深入地瞭解,

如果有些地方不合適還請見諒!

一:首先我們要知道stream是什麼?

翻譯一下它的中文是小溪,流的意思。

所以說我們要這個Stream流的作用就是用來流動檔案資料,

也就是對檔案做一些操作;

Node.js 中的Stream(流)是一個抽象介面 ,

我們在學習Node.js中的時候會遇到很多Stream,

例如:對http伺服器發起請求的request物件就是一個Stream,等等;

二:Steam的型別有哪些?

話說對於Stream流固然有其型別,就像水一樣可以流入,也可以流出去;

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

1:Readable-------可讀操作

2:Writeable--------可寫操作

3:Duplex------------可讀可寫操作

4:TransForm-------操作被寫入資料,然後讀出結果

我們可以根據自己的需要使用不同的流型別去操作資料流;

三:Stream物件常用的事件有哪些?

在前面我們已經知道了Stream是一個抽象介面,因此這個介面

必須要有自己的一些事件;

注:所有的Stream物件都是EventEmitter(核心是事件的監聽和事件的繫結)的例項;

1:data-------當有資料可讀時觸發

2:end--------沒有更多的資料可讀時觸發

3:error-------在接受資料和寫入資料的時候發生錯誤時觸發

4:finash------所有的資料已經被寫入到底層系統時觸發;

可以根據自己的需要為上面的事件設定相應的監聽函式;

四:以上我們知道stream的幾種型別,下面讓我來具體的介紹一下

這幾種型別的使用:

1:從流中讀取資料:

要從流中讀取資料,我們必須通過檔案模組下的一個createReadStream函式建立一個可讀流,

然後我們為需要讀取的資料設定資料流的編碼為utf8;

最後根據需要設定處理流事件----data,end,error

(要注意這幾個事件的使用格式)

以下是具體的從流中讀取資料的程式碼片段:

var fs=require('fs');

//例項化的readStream物件,建立可讀流
readStream=fs.createReadStream('input.txt');

var data='';

//設定讀取檔案的格式,設定編碼為utf8
readStream.setEncoding('utf8');

//注意所有的stream物件都是EventEmitter例項化的物件;
//為data設定事件的監聽者(處理流事件---->data,end,error)
readStream.on('data',function(chunk){
    data+=chunk;
});

//處理流事件end
readStream.on('end',function(){
    console.log('資料讀取完畢'+data);
});

//處理流事件error
readStream.on('error',function(error){
    console.log(error.stack);
});

console.log('程式結束');

2:建立寫入流,

通過檔案模組下的createWriteStream函式去建立一個可寫入流,注意其引數是存放寫入資料的檔名;

然後使用wirte方法寫入資料(編碼格式設定為utf8);

var fs=require('fs');

var data="We must be win !";

//建立一個可以寫入的流,寫入到檔案outPut.txt中 
var writeStream=fs.createWriteStream('outPut.txt');

//使用utf8編碼格式
writeStream.write(data,'utf8');

writeStream.end();

writeStream.on('finish',function(){
    console.log('檔案寫入完成!');
});

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

console.log('程式結束');

3:管道流,

其實管道流就是使用讀取流和寫入流實現從一個流中獲取資料傳遞到另一個流中;

var fs=require('fs');

//建立一個可讀流物件(讀取inout.txt檔案裡面的內容)
var readStream=fs.createReadStream('input.txt');

//建立一個可寫流物件,(把檔案內容寫入到outPut2.txt檔案中)
var writeStream=fs.createWriteStream('outPut2.txt');

//管道讀寫操作
//讀取input.txt檔案內容,並將內容寫入到outPut2.txt檔案中
readStream.pipe(writeStream);

console.log('程式結束');

4:鏈式流:

鏈式是通過連線輸出流到另外一個流並建立多個流操作鏈的機制。

鏈式流一般用管道操作處理資料檔案,

我們可以通過管道和鏈式結合用來壓縮和解壓檔案;

這裡我們要用到zilb這個node.js中的安裝自帶的模組,這裡需要我們引入使用:

(1):檔案的壓縮:

var fs=require('fs');

var zlib=require('zlib');

//壓縮檔案input.txt檔案為 input.txt.gz;
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));

console.log('壓縮完成');

(2):檔案的解壓縮操作:

var fs=require('fs');

var zlib=require('zlib');

//解壓input.txt.gz檔案為input.txt
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('input.txt'));

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

五:總結:

以上就是我目前對Stream流的一個基本認識;