一:由于Buffer缓存区最大缓存内存为1GB,因此对于读写大文件将无法进行工作,为此,node.js提供了Stream文件流。
(1):Stream模块提供文件流的操作,Node.js中还有很多对象实现了这个接口。例如,对HTTP服务器发起请求的request对象就是一个 Stream,还有stdout(标准输出)等。
(2):Stream有四种类型:Readable(可读文件流),Writeable(可写文件流),Duplex:可读可写文件流,Transform:操作被写入数据,然后读出结果(变换流)。
(3):在Node.js中的I/O是异步的,因此对磁盘和网络的读/写需要通过回调函数来读取数据,而回调函数需要由事件来触发,所有的Stream对象都市EventEmitter(事件触发器)的实列,常用的事件有:
data:当有数据时可读时触发。
end:没有更多的数据可以读时触发。
error:在接受或者写入过程中发生错误时触发。
finish:所有数据已被写入到底层系统时触发。
(4):可读流.js
/* 可读流: 可以让用户在源文件中分块读取文件中的数据,然后再从可读流中读取数据。 fs.createReadStream(path,[,options]); options参数有这些: flags:对文件进行何种操作. encoding:指定编码,默认为null,使用fs.setEncoding('utf-8'); start:从start开始读. end:读取文件到end为止. */ var fs = require('fs'); var tatal_data = ''; var readStream = fs.createReadStream('a.txt',encoding = '',flags = 'r',start = 'start',end = 'end'); readStream.setEncoding('utf-8'); //注意流是由事件进行驱动的 readStream.on('data',function(data_block){ tatal_data = tatal_data+data_block; }); readStream.on('end',function(){ console.log(tatal_data); }); readStream.on('error',function(err){ console.log(err.stack); });
输出:
D:Program Files
odejschapter>node 可读流.js
You often to do the error thing��yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy //??:在文件夹中是问好,但是书中没有见到怎么处理.
u
o
p
5:使用可读流将其数据读出在使用可写流将数据存入到一个文件中.
var fs = require('fs'); var readStream = fs.createReadStream('a.txt'); var writeStream = fs.createWriteStream('D:/Program Files/nodejs/chapter/output.txt'); readStream.setEncoding('utf-8'); readStream.on('data',function(data_block) { writeStream.write(data_block); //文件流写入 }); readStream.on('error',function(err){ console.log(err.stack); }); readStream.on('end',function(){ //将数据全部写入后便触发end事件,将其文件关闭. writeStream.end(); }); writeStream.on('error',function(write_err){ console.log(write_err.stack); });
6:使用pipe()处理大文件:
/* pipe()翻译成管子. 在node.js中就通过这条管子,连接写入流和可读流. */ var fs = require('fs'); //源文件路径 var srcpath = 'D:/Program Files/nodejs/chapter/a.txt'; var distpath ='D:/Program Files/nodejs/chapter/out.txt'; var readStream = fs.createReadStream(srcpath); var writeStream = fs.createWriteStream(distpath); //可以通过使用可读流的函数pipe()接入到可写流中 if(readStream.pipe(writeStream)) { console.log('文件复制成功了'); } else { console.log('文件复制失败了'); }
输出:
D:Program Files
odejschapter>node pipe处理大文件.js
文件复制成功了
7:一定要熟悉回调函数的执行机制,和事件触发机制.
on这个函数是用来绑定事件的,在jQuery.js中也大量使用到和off()取消绑定事件.