Node学习基础(四)之文件的流操作以及pipe管道简单举例

版权声明: https://blog.csdn.net/qq_41542894/article/details/82291555

 举例说明:

// 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.绑定data
rs.on("data", (data)=>{
    ws.write(data);
});

如上代码 ,会把一个从本地通过流操作读写入项目

这个过程就是先引入模块创建读入 根据官网的文档  格式就是这样的  不懂的可以直接看node官方文档 

这里重点解释一下 once,open,close和 on待会儿再说pipe管道

.once ('事件名‘,回调函数) ---相当于 bind,但是不会触发 

.once ('事件名‘,function(){})

我们这里传入的就是open而且 fs.ReadStream准备好了   碰见open后触发回调函数

Es6 语法就是.once('事件名',()=>{ }) 

.on(字符串event, 回调函数)

扫描二维码关注公众号,回复: 4034382 查看本文章

.on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

 所以遇见close就相当于关闭信号发出去了等待执行关闭

而碰见open就是WriteStream写入流被触发而进行写入

结合官方文档,我们可以把pipe方法的主要功能分解为:

  • 不断从来源可读流中获得一个指定长度的数据。
  • 将获取到的数据写入目标可写流。
  • 平衡读取和写入速度,防止读取速度大大超过写入速度时,出现大量滞留数据。

每当在stream.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  会读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成。

猜你喜欢

转载自blog.csdn.net/qq_41542894/article/details/82291555
今日推荐