Stream文件流模块
Node中File System 模块并没有提供一个 copy的方法,但是可以通过读取文件和写入文件的方式实现;
把文件A的内容全部读入Buffer缓冲区,然后再从缓冲区写入文件B,该过程的执行流程图如下:
缺点:
Buffer缓冲区限制在1GB,这样的操作对于小型的文本文件,没有多大问题,但是对于较大的文件,比如音频,视频文件,如果使用这种方法很容易使内存爆仓.
解决思路:
采用"读一部分,写一部分"方式;不管文件有多大,只要时间允许,总会处理完成.
文件A中的数据以流动的形式通过数据管道,然后写入到文件B中
例如: 在网络上观看视频,并不是整个视频都下载好了才播放的,而是下一点播一点.
优点:
接收方可以提前处理,缩短等待时间,提高速度.
Node.js中文件流的操作由Stream模块提供
使用文件流进行文件复制,首先要创建一个可读流(Readable Stream),可读流可以让用户在源文件中分块读取文件中的数据,然后再从可读流中读取数据.创建可读流的语法如下:
fs.createReadStream(path[,options])
说明:由于流是基于EventEmitter的,从流读取数据的最好方法是监听数据事件,并附加一个回调函数
Stream常用事件表:
事件 | 说明 |
---|---|
data | 当有数据可读时触发 |
end | 没有更多数据可读时触发 |
error | 在接收和写入过程中发生错误时触发 |
finish | 所有数据已经被写入到底层系统是触发 |
接下来我们可以结合一个案例演示进一步学习,
创建一个demo文件夹,在文件夹下创建一个input.txt文件,并写入一句话;然后再创建一个read.js文件,代码如下:
/**
* 从流中读取数据
*/
var fs = require('fs')
var total = ''
// 创建可读流
var readableStream = fs.createReadStream(