Node.js提供的又一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
从文件流文本内容的示例
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寫入二進制數據
要注意,data事件可能会有多次,每次传递的chunk是流的一部分数据。
createWriteStream
要以流的形式文件,只需要不断调用write()方法,最后以end()结束:
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('text.text', 'utf-8');
ws1.write('使用Stream寫入文本數據...\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寫入文本數據...\n');
ws1.write('END.');
ws1.write('123456789.');
ws1.end();
var ws2 = fs.createWriteStream('text.text');
ws2.write(new Buffer('使用Stream寫入文本數據','utf-8'));
ws2.write(new Buffer('...\nggg','utf-8'))
ws2.write(new Buffer('1','utf-8'))
ws2.end()
(text.text)直接被改寫為:
ws1每個字符串都被ws2得對應長度的字符串一一所,沒有被覆蓋的直接輸出;
可以在ws1一開始定義'utf-8',也可以在輸出的時候加上'utf-8'.
例子3:
'use strict';
var fs = require('fs');
var ws1 = fs.createWriteStream('text.text', 'utf-8');
ws1.write('使用Stream寫入文本數據...\n');
ws1.write('END.');
ws1.write('123456789.');
ws1.end();
var ws2 = fs.createWriteStream('text.text');
ws2.write(new Buffer('使用Stream寫入文本數據','utf-8'));
ws2.write(new Buffer('...**ggg','utf-8'))
ws2.write(new Buffer('1','utf-8'))
ws2.end()
轉譯符也被當做2個字節看待。
所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable。
pipe
就像可以把两个水管串成一个更长的水管一样,两个流也可以串起来。一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe。
在Node.js中,Readable流有一个pipe()方法,就是用来干这件事的。
让我们用pipe()把一个文件流和另一个文件流串起来,这样源文件的所有数据就自动写入到目标文件里了,所以,这实际上是一个复制文件的程序:
(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寫入文本數據...**ggg123456789.
(text.text'):
我是node
如果pipe的文件,文件內容直接被重寫,而pipe的文件,則在createWriteStream的路徑下新建一個createReadStream路徑一樣的文件。
默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数:(剛入門並不是很了解這個實際用途,先筆記下來,有大神的可以回復一下,Thx)
readable.pipe(writable, { end: false });