Node stream流

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

目錄:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章