本文共 1803 字,大约阅读时间需要 6 分钟。
举例说明:
// 1.引入模块let fs =require('fs');//2.创建读入流let rs = fs.createReadStream('D:/Pictures/Saved Pictures/testSP.mp4'); //要读取视频的位置let ws = fs.createWriteStream('testSP.mp4'); //视屏要写入的位置,我这里是默认的项目文件夹下的//3.监听流的打开和关闭ws.once('open' ,()=>{ console.log("读入通道打开");});ws.once('close' ,()=>{ console.log("读入通道以关闭");});rs.once('open' ,()=>{ console.log("写出通道已打开");});rs.once('close' ,()=>{ console.log("写出通道已关闭");});//4.绑定datars.on("data", (data)=>{ ws.write(data);});
如上代码 ,会把一个从本地通过流操作读写入项目
这个过程就是先引入模块创建读入 根据官网的文档 格式就是这样的 不懂的可以直接看node
这里重点解释一下 once,open,close和 on待会儿再说pipe管道
.once ('事件名‘,回调函数) ---相当于 bind,但是不会触发
.once ('事件名‘,function(){})
我们这里传入的就是open而且 fs.ReadStream准备好了 碰见open后触发回调函数
Es6 语法就是.once('事件名',()=>{ })
.on(字符串event, 回调函数)
.on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。所以遇见close就相当于关闭信号发出去了等待执行关闭
而碰见open就是WriteStream写入流被触发而进行写入
结合,我们可以把pipe
方法的主要功能分解为:
每当在可读流上调用方法时,就会发出此消息,并将此可写入添加到其目标集。
//官方文档举例var writer = getWritableStreamSomehow();var reader = getReadableStreamSomehow();writer.on('pipe', (src) => { console.error('something is piping into the writer'); assert.equal(src, reader);});reader.pipe(writer);
如果看不懂这个 我用刚才的例子改变一下 你们就能理解了
// 1.引入模块let fs =require('fs');var request = require('request');//2.创建读入流let rs = fs.createReadStream('D:/Pictures/Saved Pictures/testSP.mp4'); //要读取视频的位置let ws = fs.createWriteStream('testSP.mp4'); //视屏要写入的位置//创建管道rs.pipe(ws);
这里和最上面的代码对比 这里从写入位置之后就没有那么多繁琐的代码了
而使用pipe的效果和最初的读入效果完全一样没有任何区别 读入的损失都无差距
在这里其实 stream.on 是有缺点的,这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如 grunt-file-copy 就是这样实现的。但是对于体积较大的二进制,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。
而使用pipe 会读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成。