频道栏目
首页 > 程序开发 > web前端 > HTML/CSS > 正文
node中的流是什么?Stream对象常用的事件及常用的流操作讲解
2018-01-10 11:54:26      个评论    来源:优雅的博客  
收藏   我要投稿

官方定义流(Stream)

Stream 是一个抽象接口,Node 中有很多对象(http,fs,zlib,tcp)实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

流是可读、可写或者可读写的。

我的理解流就是处理数据的一种方式,一般是一个一个的处理数据,用流的方式是一块一块的处理,提高了处理数据的速率,减轻了缓冲区的压力。

Stream 对象常用的事件有:

data - 当有数据可读时触发。 end - 没有更多的数据可读时触发。 error - 在接收和写入过程中发生错误时触发。 finish - 所有数据已被写入到底层系统时触发。

常用的流操作

1. 利用流读取数据

var fs = require('fs');
var data ='';
var readerStream = fs.createReadStream('input.txt'); //创建可读流
readerStream.setEncoding('UTF8');

readerStream.on('data',(chunk)=>{  //处理流事件,因为数据是以块传输的,所以为chunk
    data += chunk;
});

readerStream.on('end',()=>{
    console.log(data);
});
readerStream.on('error',(err)=>{
    console.log(err.stack);
})

console.log('程序执行完毕');

如果读取的文件很大,程序不会出现阻塞情况。因为程序遇到读取数据的程序,这个程序相当于有一个回调函数,会把这段程序交给后台处理,主程序继续执行下面的代码。这就是NODE的事件驱动。

试验用的input.txt文件大小为4k,此时运行程序,

先输出‘程序执行完毕’,

再输出input.txt文件里的内容

2. 写入流

var fs = require('fs');
var data = '优雅的博客https://mp.blog.csdn.net/postlist';
var writerStream = fs.createWriteStream('output.txt'); //创建写入流
writerStream.write(data,'UTF8'); //如果文件中原来有内容,会覆盖

writerStream.end();       //标记文件末尾,只有标记了文件末尾,finish中的代码才会执行

writerStream.on('finish',()=>{
    console.log('写入完成');
});
writerStream.on('error',()=>{
    console.log(err.stack);
});
console.log('程序执行完毕');

3.管道流

管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。利用管道流可以实现文件的复制,速度快,并且不会阻塞其他操作。

var fs = require('fs');
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
readerStream.pipe(writerStream);   //先read后write
console.log('success'); 

4.链式流

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作,一个链式流相当于几个管道流的集合。

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));

console.log("文件压缩完成。");
点击复制链接 与好友分享!回本站首页
上一篇:什么是持久化缓存?如何用webpack实现持久化缓存?
下一篇:github上传项目文件的步骤教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站