博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node学习基础(四)之文件的流操作以及pipe管道简单举例
阅读量:3907 次
发布时间:2019-05-23

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

你可能感兴趣的文章
欢迎使用CSDN-markdown编辑器
查看>>
剑指Offer
查看>>
五大常用算法&实例列举
查看>>
网页乱码分析
查看>>
java 线程:sleep join yield | wait notify notifyAll
查看>>
Python 包、模块 概念 from 、import 关键字
查看>>
世界各国的手机号码
查看>>
通配符与正则表达式
查看>>
c++ 与 Java 之 红黑树 哈希表 辨析
查看>>
open GL 、DirectX、open CV、 open Inventor 、cocos2dx、unity3d、3dmax辨析
查看>>
理解矩阵
查看>>
彩虹七色的RGB值
查看>>
常用正则表达式实例
查看>>
web网站架构演变过程
查看>>
c、 c++、 java 基本数据类型 对比辨析
查看>>
自然语言处理(NLP)四步流程:Embed->Encode->Attend->Predict
查看>>
python机器学习包 Windows下 pip安装 scikit-learn numpy scipy
查看>>
[转发]机器学习资源大全
查看>>
《数学之美》知识点详细总结
查看>>
机器学习 数据挖掘 数据集划分 训练集 验证集 测试集
查看>>