zoukankan      html  css  js  c++  java
  • nodejs基础(管道、流)实现:复制、压缩、加密、解压,解密,写入文件

    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("哈哈");

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

  • 相关阅读:
    【排序】冒泡排序,C++实现
    【排序】选择排序,C++实现
    【排序】插入排序,C++实现
    【集成学习】 lightgbm原理
    leetcode1310
    leetcode1309
    leetcode1300
    leetcode1302
    leetcode1299
    leetcode1306
  • 原文地址:https://www.cnblogs.com/fqh123/p/11255791.html
Copyright © 2011-2022 走看看