Stream 是一個抽象接口,Node 中有很多對象實現了這個接口。
例如,對http 服務器發起請求request 對象就是一個 Stream,還有stdout(標準輸出)
Node.js,Stream 有四種流類型:
Readable - 可讀操作。
Writable - 可寫操作。
Duplex - 可讀可寫操作.
Transform - 操作被寫入數據,然後讀出結果。
所有的 Stream 對象都是 EventEmitter 的實例,常用的事件有:
data - 當有數據可讀時觸發。
end - 沒有更多的數據可讀時觸發。
error - 在接收和寫入過程中發生錯誤時觸發。
finish - 所有數據已被寫入到底層系統時觸發。
App.js:
var http=require("http");
var stream=require("./stream");
var emit=require("./emit");
var bibe=require("./bibe");
http.createServer(function(req,res){
if(req.url!="/favicon.ico"){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
//執行流文件
stream();
emit();
bibe();
res.write("服務器");
}
res.end();
}).listen(8100);
- 讀取流和寫入流:
stream.js:
var fs=require("fs");
module.exports=function(){
//讀取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
//設置流文件的編碼格式
readStream.setEncoding("utf-8");
//data事件 當有可讀的數據時觸發的事件
readStream.on("data",function(res){
result+=res;
});
//end事件 當沒有數據可讀時觸發的事件
readStream.on("end",function(){
//輸出所有的流數據
console.log(result);
});
//error事件 在流讀取的時候出現異常 讀取失敗
readStream.on("error",function(err){
if(err) throw err;
});
//寫入流 writeable
var txt="我是寫入數據";
//創建寫入流
var writeStream=fs.createWriteStream("./list/text.txt");
//寫入數據
writeStream.write(txt,"utf-8");
//關閉流 寫入流關閉之後,觸發finish事件
writeStream.end();
//寫入流 執行完成
writeStream.on("finish",function(){
console.log("數據寫入完成");
});
}
如何實現從data.txt中讀取,從text.txt中寫入?
法一:使用Promise實現
stream.js:
var fs=require("fs");
module.exports=function(){
var promise=new Promise(function(resolve){
//讀取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
//設置流文件的編碼格式
readStream.setEncoding("utf-8");
//data事件 當有可讀的數據時觸發的事件
readStream.on("data",function(res){
result+=res;
});
//end事件 當沒有數據可讀時觸發的事件
readStream.on("end",function(){
//輸出所有的流數據
resolve(result);
});
//error事件 在流讀取的時候出現異常 讀取失敗
readStream.on("error",function(err){
if(err) throw err;
});
});
promise.then(function(res){
var txt=res;
//創建寫入流
var writeStream=fs.createWriteStream("./list/text.txt");
//寫入數據
writeStream.write(txt,"utf-8");
//關閉流 寫入流關閉
writeStream.end();
//寫入流 執行完成
writeStream.on("finish",function(){
console.log("數據寫入完成");
});
});
}
法二:使用EventEmitter事件車實現
emit.js:
var fs=require("fs");
//廣播 事件車 廣播和發送
var event=require("events");
//node裏EventEmitter爲事件廣播類 在整個node項目中都能使用 不能多次new
var emit=new event.EventEmitter();
module.exports=function(){
//讀取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
readStream.setEncoding("utf-8");
readStream.on("data",function(res){
result+=res;
});
readStream.on("end",function(){
//輸出所有的流數據
//發送廣播
emit.emit("tosend",result)
});
readStream.on("error",function(err){
if(err) throw err;
});
//接收廣播
emit.on("tosend",function(res){
//創建寫入流
var txt=res;
var writeStream=fs.createWriteStream("./list/text.txt");
writeStream.write(txt,"utf-8");
writeStream.end();
writeStream.on("finish",function(){
console.log("數據寫入完成");
});
});
}
- 管道流
pipe.js:
var fs=require("fs");
//管道流 邊讀邊寫
var readStream=fs.createReadStream("./data.txt");
var writeStream=fs.createWriteStream("./list/text.txt");
readStream.pipe(writeStream);
目錄: