nodejs基礎(管道、流)實現:複製、壓縮、加密、解壓,解密,寫入文件

stream流 都是events.EventEmitter的一個實例,均可以來建立自定義事件(也就是說,流是一個事件的實例)node

 

在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,看着是一串數字ui

固然,還能夠另外一種設置編碼的方式:編碼

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是接收完畢後的監聽函數
    
})

 寫入流 還有一種用法spa

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");
})

 

管道的使用pipecode

用管道來實現賦值文件會很是簡單:blog

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

能夠在終端打印出指定內容

相關文章
相關標籤/搜索