stream流 都是events.EventEmitter的一个实例,都可以来创建自定义事件(也就是说,流是一个事件的实例)

在nodejs中 对http的请求与响应都是用流来实现的,请求就是一个输入的流,响应就是一个输出的流

使用stream流,可以提高性能,前面说的读写文件,是一次性把文件放在内存中,这样就不大合适了,而stream流,是将读取的文件放在Buffer(缓存)中。就是一边放,一边处理,steam流有两个好处,就是处理数据和提高性能。

下面来实现一个流:

var fs = require('fs');

var myReadStream = fs.createReadStream(__dirname+"/readMe.txt","utf8");//创建一个读取流的实例

var data="";//创建一个变量来接收文件

myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数  当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次
data+=chunk;
}) myReadStream.on("end",function(){//end是接收完毕后的监听函数
console.log(data);
})

上诉代码,如果不设置编码为utf8,data值将会为Buffer,看着是一串数字

当然,还可以另一种设置编码的方式:

var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例

myReadStream.setEncoding("utf8");//设置编码

var data="";//创建一个变量来接收文件

myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数  当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次
data+=chunk;
}) myReadStream.on("end",function(){//end是接收完毕后的监听函数
console.log(data);
})

在原来的基础上写一个写入流:

var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例
var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流 myReadStream.setEncoding("utf8");//设置编码 myReadStream.on("data",function(chunk){//data是在接收数据的时候用的监听函数 当文件很大时,是把文件分成很多Buffer来接收的 所以这个函数可能执行多次
myWriteStream.write(chunk);//将读取到的片段写入,参数就是要写入的内容
}) myReadStream.on("end",function(){//end是接收完毕后的监听函数 })

写入流 还有一种用法

var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流

var writeData = "hello world";
myWriteStream.write(writeData);//写入
myWriteStream.end();//写入完之后调用end方法 (调用这个方法是 代表这个流结束了,如果不掉用这个流,这个流是结束不了的,finish方法不会触发)
myWriteStream.on("finish",function(){//加一个监听函数,监听撸结束后
console.log("finished");
})

管道的使用pipe

用管道来实现赋值文件会非常简单:

var fs = require('fs');

var myReadStream = fs.createReadStream(__dirname+"/readMe.txt");//创建一个读取流的实例
var myWriteStream = fs.createWriteStream(__dirname+"/writeMe.txt");//创建一个写入流
myReadStream.pipe(myWriteStream);//使用管道 将读取流和写入流连接到一起

下面来上一个真实的代码,读取文件,加密,压缩,然后写入

var crypto = require("crypto");//用来加密
var fs = require("fs");
var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password");
var encryptStream = crypto.createCipher('aes-256-cbc',password); var gzip = zlib.createGzip();
var readStream = fs.createReadStream(__dirname+"/readMe.txt");
var writeStream = fs.createWriteStream(__dirname+"/out.gz"); readStream//读取
.pipe(encryptStream)//加密
.pipe(gzip)//压缩
.pipe(writeStream)//写入
.on("finish",function(){//写入结束的回调
console.log("done");
})

下面将上面代码压缩出来的out.gz文件解压,解密,然后输出到终端

var crypto = require("crypto");//用来加密
var fs = require("fs");
var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password");
var decryptStream = crypto.createDecipher('aes-256-cbc',password); var gzip = zlib.createGunzip();//解压
var readStream = fs.createReadStream(__dirname+"/out.gz"); readStream//读取
.pipe(gzip)//解压
.pipe(decryptStream)//解密
.pipe(process.stdout)//输出到终端中 标准输出
.on("finish",function(){//解压后的回调
console.log("done");
})

上面的代码稍微更改一下,将解密,解压出来的文件写入到deOut.txt文件中

var crypto = require("crypto");//用来加密
var fs = require("fs");
var zlib = require("zlib");//用来压缩 var password = new Buffer(process.env.PASS || "password");
var decryptStream = crypto.createDecipher('aes-256-cbc',password); var gzip = zlib.createGunzip();//解压
var readStream = fs.createReadStream(__dirname+"/out.gz");
var writeStream = fs.createWriteStream(__dirname+"/deOut.txt"); readStream//读取
.pipe(gzip)//解压
.pipe(decryptStream)//解密
.pipe(writeStream)//将解密,解压的文件写入到deOut.txt文件中
.on("finish",function(){//解压后的回调
console.log("done");
})

小知识:

process.stdout.write("哈哈");

可以在终端打印出指定内容

nodejs基础(管道、流)实现:复制、压缩、加密、解压,解密,写入文件的更多相关文章

  1. python用模块zlib压缩与解压字符串和文件的方法

    摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...

  2. Ubuntu下压缩与解压各种文件的命令

    1.压缩与解压xz文件 (1)压缩 xz -z  filename (2)解压 xz -d  filename.xz 2.压缩与解压tar文件 (1)压缩 tar -cvf  filename(压缩到 ...

  3. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  4. 用DELPHI 开发压缩、解压、自解压、加密

    引 言:在日常中,我们一定使用过WINZIP.WINRAR这样的出名的压缩软件,就是我们开发软件过程中不免要遇到数据加密.数据压缩的问题!本文中就这一技术问题展开探讨,同时感谢各位网友的技巧,在我每次 ...

  5. 使用.Net自带的GZipStream进行流压缩与解压

    using System.IO; using System.IO.Compression; using System.Text; namespace CS.Utility { /// <summ ...

  6. 记录新项目中遇到的技术及自己忘记的技术点【DES加密解密,MD5加密,字符串压缩、解压,字符串截取等操作】

    一.DES加密.解密 #region DES加密解密 /// <summary> /// 进行DES加密 /// </summary> /// <param name=& ...

  7. python的shutil模块-文件的移动、复制、打包、压缩、解压等

    参考https://www.cnblogs.com/xiangsikai/p/7787101.html os模块提供了对目录或者文件的新建.删除.查看文件属性,还提供了对文件以及目录的路径操作,比如说 ...

  8. 文件操作工具类: 文件/目录的创建、删除、移动、复制、zip压缩与解压.

    FileOperationUtils.java package com.xnl.utils; import java.io.BufferedInputStream; import java.io.Bu ...

  9. Java的压缩、解压及压缩加密、解密解压 样例

    为了节约带宽.加快传送速度,http协议支持gzip的压缩,但假设我们的app与后台不是通过http协议通讯的.那么压缩.解压这个流程须要自己写.以下给出compress和decompress的代码: ...

  10. I/O操作之文件压缩与解压

    与文件压缩与解压相关的类在java.util.zip包下 实例 //文件压缩 import java.io.File; import java.io.FileInputStream; import j ...

随机推荐

  1. (五)Hibernate的增删改查操作(2)

    接上一章节 HQL的预编译语句 HIbernate中的预编译与Spring的预编译的处理差不多.    1:使用标准的?  2:使用命名参数   2.1:使用名称逐个设置.   2.2:使用Map(k ...

  2. datagrid使用和文字超出tip提示

    function LoadTable(queryData) {             $("#eventInfoTable").datagrid({               ...

  3. 解决https 请求过程中SSL问题

    最近一个项目中用到了https的请求,在实际调用过程中发现之前的http方法不支持https,调用一直报错. 查询了一下,添加几行代码解决问题. public string HttpPost(stri ...

  4. python运行报错:cannot import name 'InteractiveConsole'

    ModuleNotFoundError: No module named '_pydevd_bundle.pydevd_cython' ImportError: cannot import name ...

  5. JS实现当前选择日期是星期几

    使用到的日期插件是My97 Datepicker,这里通过onpicked方法触发getDay()方法,在getDay()方法中获取已选择的日期来判断是星期几. 插件下载地址:http://www.m ...

  6. ES6 class 于 继承 extends

    之前构造函数,没有类的概念,ES6中有了class类这个东西. 简单的一个例子: 输出: 需要注意的是,语法换了,但是构造函数.构造函数的原型.实例的关系还是那样. 输出: 需要注意写法: 底层还是p ...

  7. 字体图标iconfont

    字体图标的作用: 1. 可以做出图片一样可以做的事情, 改变透明度, 旋转度,等... 2. 但是本质其实是文字,可以很随意的改变颜色, 产生阴影,透明效果等 3. 本身体积更小,但携带的信息并没有消 ...

  8. 2019年Java后端工程师常见面试题和感想

    来新公司有5个月了,从第二个月开始就参与公司后端工程师的面试工作了,包括校招在内,面试超过100个(包括40个校招的终面)应聘者了,应聘者中有超过10年的技术经理,有6年以上的高级开发,有3到5年的中 ...

  9. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

  10. 【2018-01-26】SqlServer 检查死锁和阻塞

    利用sys.sysprocesses SQL进程检查是否出现死锁和阻塞 Sys.SysProcesses 系统表是一个很重要的系统视图,主要用来定位与解决Sql Server的阻塞和死锁 select ...