Node.js提供的又一個僅在服務(wù)區(qū)端可用的模塊帖汞,目的是支持“流”這種數(shù)據(jù)結(jié)構(gòu)。
從文件流文本內(nèi)容的示例
createReadStream
(index13.js)
'use strit'
var fs = require('fs');
//打開一個流
var rs = fs.createReadStream('text.text','utf-8');
rs.on('data',function(chunk){
console.log('DATA:')
console.log(chunk)
})
rs.on('end',function(){
console.log('End')
})
rs.on('error',function(err){
console.log('ERROR'+err)
})
(text.text)
使用Stream寫入二進制數(shù)據(jù)
要注意,data事件可能會有多次芍躏,每次傳遞的chunk是流的一部分數(shù)據(jù)。
createWriteStream
要以流的形式文件,只需要不斷調(diào)用write()方法定庵,最后以end()結(jié)束:
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('text.text', 'utf-8');
ws1.write('使用Stream寫入文本數(shù)據(jù)...\n');
ws1.write('END.');
ws1.write('END.');
ws1.end();
(text.text)直接被改寫為:
例子2:
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('text.text', 'utf-8');
ws1.write('使用Stream寫入文本數(shù)據(jù)...\n');
ws1.write('END.');
ws1.write('123456789.');
ws1.end();
var ws2 = fs.createWriteStream('text.text');
ws2.write(new Buffer('使用Stream寫入文本數(shù)據(jù)','utf-8'));
ws2.write(new Buffer('...\nggg','utf-8'))
ws2.write(new Buffer('1','utf-8'))
ws2.end()
(text.text)直接被改寫為:
ws1每個字符串都被ws2得對應(yīng)長度的字符串一一所,沒有被覆蓋的直接輸出;
可以在ws1一開始定義'utf-8',也可以在輸出的時候加上'utf-8'.
例子3:
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('text.text', 'utf-8');
ws1.write('使用Stream寫入文本數(shù)據(jù)...\n');
ws1.write('END.');
ws1.write('123456789.');
ws1.end();
var ws2 = fs.createWriteStream('text.text');
ws2.write(new Buffer('使用Stream寫入文本數(shù)據(jù)','utf-8'));
ws2.write(new Buffer('...**ggg','utf-8'))
ws2.write(new Buffer('1','utf-8'))
ws2.end()
轉(zhuǎn)譯符也被當做2個字節(jié)看待踪危。
所有可以讀取數(shù)據(jù)的流都繼承自stream.Readable蔬浙,所有可以寫入的流都繼承自stream.Writable。
pipe
就像可以把兩個水管串成一個更長的水管一樣贞远,兩個流也可以串起來畴博。一個Readable流和一個Writable流串起來后,所有的數(shù)據(jù)自動從Readable流進入Writable流蓝仲,這種操作叫pipe俱病。
在Node.js中,Readable流有一個pipe()方法袱结,就是用來干這件事的庶艾。
讓我們用pipe()把一個文件流和另一個文件流串起來,這樣源文件的所有數(shù)據(jù)就自動寫入到目標文件里了擎勘,所以咱揍,這實際上是一個復(fù)制文件的程序:
(index15.js)
'use strict'
var fs = require('fs');
var rs = fs.createReadStream('node.text')
var ws = fs.createWriteStream('text.text')
rs.pipe(ws)
(node.text')
我是node
(text.text')
使用Stream寫入文本數(shù)據(jù)...**ggg123456789.
(text.text'):
我是node
如果pipe的文件,文件內(nèi)容直接被重寫棚饵,而pipe
的文件煤裙,則在createWriteStream的路徑下新建一個createReadStream路徑一樣的文件。
默認情況下噪漾,當Readable流的數(shù)據(jù)讀取完畢硼砰,end事件觸發(fā)后,將自動關(guān)閉Writable流欣硼。如果我們不希望自動關(guān)閉Writable流题翰,需要傳入?yún)?shù):(剛?cè)腴T並不是很了解這個實際用途,先筆記下來,有大神的可以回復(fù)一下豹障,Thx)
readable.pipe(writable, { end: false });