1、讀取流
var readStream = fs.createReadStream(“57b51ea9Nb862ca5e.png”);
readStream.on(“data”,function(chunk){
console.log(chunk);
});
readStream.on(“end”,function(){
console.log(“end”);
});
readStream.on(“error”,function(){
console.log(“error”);
});
2、寫入流
var writeStream = fs.createWriteStream(“1.txt”);
writeStream.write(“加的老師\ndasd”);
writeStream.on(“end”,function () {
console.log(“end”);
});
所有可以讀取資料的流都繼承自stream.Readable,所有可以寫入的流都繼承自stream.Writable。
3、使用pipe
Readable中有一個pipe(),該方法可以将一個Readable流傳送到一個Writeable流,其實複制檔案也是這個思路,一邊讀取檔案,一邊寫入檔案:
var readStream = fs.createReadStream(“1.txt”);
var writeStream = fs.createWriteStream(“3.txt”);//3.txt不存在會自動建立
readStream.pipe(writeStream);
預設情況下,當Readable流的資料讀取完畢,end事件觸發後,将自動關閉Writable流。如果我們不希望自動關閉Writable流,需要傳入參數,傳入end傳輸為false,則觸發end事件時write流不會關閉:
readStream.pipe(writeStream , {end : false});
4、複制大檔案(視訊等)的例子
“use strict”;
var fs = require(“fs”);
var writeStream = fs.createWriteStream(“copy.avi”);//建立寫入流
var readStream = fs.createReadStream(“7-Activiti完成自動發送郵件功能.avi”);//建立讀取流
var totalSize = fs.statSync(“7-Activiti完成自動發送郵件功能.avi”).size;//總大小
var start = Date.now();//開始時間
var hasWriteStream = 0;//已經複制的内容
var timer = setInterval(compute,10);//定時器,每10豪秒執行一次compute函數
readStream.on(“data”,function (chunk) {
hasWriteStream += chunk.length;//累加已讀取内容
if(writeStream.write(chunk) === false){ // 若資料沒有完全寫入,則暫停隻讀流讀取資料
readStream.pause();
}
});
readStream.on(“end”,function () {
writeStream.end();//寫入全部結束觸發end事件
clearInterval(timer);//清除定時器
});
writeStream.on(“drain”,function(){
//若寫入流的資料已寫入完畢,則喚醒隻讀流繼續讀取資料
readStream.resume();
});
function compute(){
var domain = Date.now() - start;
console.log(“用時:” + domain +“ms----------”+ “已讀取:” + hasWriteStream / 1000000 + “M” )
}