前言:
前一段时间,四弟斗牛犬(奶沫),掏钱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)》.