node中的stream(流)內建模組

2022-05-18 09:05:41 字數 3556 閱讀 5598

stream是node.js提供的又乙個僅在服務區端可用的模組,目的是支援「流」這種資料結構。

什麼是流?流是一種抽象的資料結構。想象水流,當在水管中流動時,就可以從某個地方(例如自來水廠)源源不斷地到達另乙個地方(比如你家的洗手池)。我們也可以把資料看成是資料流,比如你敲鍵盤的時候,就可以把每個字元依次連起來,看成字元流。這個流是從鍵盤輸入到應用程式,實際上它還對應著乙個名字:標準輸入流(stdin)。

如果應用程式把字元乙個乙個輸出到顯示器上,這也可以看成是乙個流,這個流也有名字:標準輸出流(stdout)。流的特點是資料是有序的,而且必須依次讀取,或者依次寫入,不能像array那樣隨機定位。

有些流用來讀取資料,比如從檔案讀取資料時,可以開啟乙個檔案流,然後從檔案流中不斷地讀取資料。有些流用來寫入資料,比如向檔案寫入資料時,只需要把資料不斷地往檔案流中寫進去就可以了。

在node.js中,流也是乙個物件,我們只需要響應流的事件就可以了:data事件表示流的資料已經可以讀取了,end事件表示這個流已經到末尾了,沒有資料可以讀取了,error事件表示出錯了。

下面是乙個從檔案流讀取文字內容的示例:

'use strict';

var fs = require('fs');

//開啟乙個流:

var rs = fs.createreadstream('sample.txt', 'utf-8');

rs.on('data', function

(chunk) );

rs.on('end', function

() );

rs.on('error', function

(err) );

要注意,data事件可能會有多次,每次傳遞的chunk是流的一部分資料。

要以流的形式寫入檔案,只需要不斷呼叫write()方法,最後以end()結束:

'use strict';

var fs = require('fs');

var ws1 = fs.createwritestream('output1.txt', 'utf-8');

ws1.write('使用stream寫入文字資料...\n');

ws1.write('end.');

ws1.end();

var ws2 = fs.createwritestream('output2.txt');

ws2.write(buffer.from('使用stream寫入二進位制資料...\n', 'utf-8'));

ws2.write(buffer.from('end.', 'utf-8'));

ws2.end();

所有可以讀取資料的流都繼承自stream.readable,所有可以寫入的流都繼承自stream.writable

就像可以把兩個水管串成乙個更長的水管一樣,兩個流也可以串起來。乙個readable流和乙個writable流串起來後,所有的資料自動從readable流進入writable流,這種操作叫pipe

node.js中,readable流有乙個pipe()方法,就是用來幹這件事的。

讓我們用pipe()把乙個檔案流和另乙個檔案流串起來,這樣原始檔的所有資料就自動寫入到目標檔案裡了,所以,這實際上是乙個複製檔案的程式:

'use strict';

var fs = require('fs');

var rs = fs.createreadstream('sample.txt');

var ws = fs.createwritestream('copied.txt');

rs.pipe(ws);

預設情況下,當readable流的資料讀取完畢,end事件觸發後,將自動關閉writable流。如果我們不希望自動關閉writable流,需要傳入引數:

readable.pipe(writable, );
如果pipe()中的寫入流有自己寫的內容,則寫入流寫入的內容會在讀取流的前面,如果想讓寫入流的內容在讀取流內容的後面出現,可以將寫入流的**寫在讀取流end事件中。

以下是自己練習的**:

'use strict'

var fs=require('fs');

//開啟乙個讀取流

var rs=fs.createreadstream("txt/test1.txt",'utf-8');

//data事件表示流的資料已經可以讀取了

rs.on('data',function

(chunk));

//end事件表示這個流已經到末尾了

rs.on('end',function

())//

error事件表示出錯了

rs.on('error',function

(err))

//要以流的形式寫入檔案,只需要不斷呼叫write()方法,最後以end()結束:

var ws1=fs.createwritestream("output/output2.txt",'utf-8');

ws1.write('使用stream寫入文字資料...\n');//

\n代表換行

ws1.write('第二步寫入\n');

ws1.write('最後一次寫入 end\n');

ws1.end();

//此流結束

//使用stream寫入二進位制資料

var ws2 = fs.createwritestream('output/output3.txt');

ws2.write(buffer.from('使用stream寫入二進位制資料...\n', 'utf-8'));

ws2.write(buffer.from('end.', 'utf-8'));

ws2.end();

//pipe(),將讀取流和寫入流連線起來

var rs2=fs.createreadstream("txt/test1.txt",'utf-8');

rs2.on('data',function

(chunk));

rs2.on('end',function

())rs2.on('error',function

(err))

var ws3=fs.createwritestream("output/output4.txt",'utf-8');

ws3.write("我是ws3自己寫入的內容\n");

ws3.write("ws3又寫了一行文字\n");

rs2.pipe(ws3,);//

end為true代表 讀取流結束後 將自動關閉寫入流

Node常用內建模組 stream

檔案流讀取文字內容 use strict var fs require fs var rs fs.createreadstream sample.txt utf 8 rs.on data function chunk rs.on end function chunk rs.on error func...

了解nodeJs中的流(stream)

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...

了解nodeJs中的流(stream)

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...