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...