Stream文件流

一:由于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\nodejs\chapter>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\nodejs\chapter>node pipe处理大文件.js
文件复制成功了

 

7:一定要熟悉回调函数的执行机制,和事件触发机制.

  on这个函数是用来绑定事件的,在jQuery.js中也大量使用到和off()取消绑定事件.

 

posted @ 2020-03-16 23:37  calm寻路人  阅读(591)  评论(0编辑  收藏  举报