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

目录:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值