nodejs Stream 初探

Nodejs cyanprobe 8年前 (2016-04-17) 3986次浏览 已收录 2个评论

前言:

前一段时间,四弟斗牛犬(奶沫),掏钱50狗币让我给扒一个页面,写一个钓鱼页面,就是把表单给存起来,以前貌似拿php撸过,这种缺德的事情当然不能干(PS:狗币太少)。正好拿来撸nodejs的Stream流,看着文档自己学习下。

关于流:

定义:流是一个抽象接口,被 Node 中的很多对象所实现。比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流。流是可读、可写或兼具两者的。所有流都是 EventEmitter 的实例。比如http中的req,res就是流。ps:所有流都是EventEmitter——实例包含data – 当有数据可读时触发。end – 没有更多的数据可读时触发。error – 在接收和写入过程中发生错误时触发。finish – 所有数据已被写入到底层系统时触发。

    var fs = require("fs");
    var data = '';
    // 创建可读流
    var readerStream = fs.createReadStream('input.txt');
    // 设置编码流utf8。
    readerStream.setEncoding('UTF8');
    // 处理流事件 --> data, end, and error
    readerStream.on('data', function(chunk) {
        data += chunk;
});
readerStream.on('end',function(){
    console.log(data);
});
readerStream.on('error', function(err){
    console.log(err.stack);
});
console.log("执行和结束");

上面的例子成功读取”input.txt”的内容,下面我们来尝试写入流。

var fs = require("fs");
var data = '柴犬家族~~';
// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');
// 编码使用utf8
writerStream.write(data,'UTF8');
// 标记文件末尾
writerStream.end();
// 处理流事件 --> data, end, and error 监听finish
writerStream.on('finish', function() {
    console.log("写入完成。");
});
//若出现错误
writerStream.on('error', function(err){
    console.log(err.stack);
});
console.log("程序执行完毕");

好了,上面我们使用文件流进行操作,这种东西初学时候已经撸过,下面我们来看看管道流。

管道流:

定义:管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。
我们使用(pipe)管子来连接两个流对象。

var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');
// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);
//待写入管道准备——》读流
console.log("程序执行完毕");

看完了管道流,接下来来看看链式流。链式流是基于管道的。

链式流

定义:输出流流经多个处理对象,比如下面这个压缩操作:

var fs = require("fs");
var zlib = require('zlib');//zlib是nodejs的压缩模块
// 压缩 input.txt 文件为 input.gz
fs.createReadStream('input.txt')
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream('input.gz'));
console.log("文件压缩完成");

后记:

nodejs几乎到处可见流,这个API包含更多,详情请看nodejs API Stream模块,另外,推荐一篇非常好的文章 《通过源码解析nodejs中的导流(pipe)》.
 
 
 


CyanProbe , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:nodejs Stream 初探
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 好,你个土狗,亏还是亲兄弟呢!人家免费都已经帮我搞好了!
    奶沫2016-05-06 19:57 回复
  2. 研究研究,学习学习。
    zengda2016-05-16 10:40 回复