在学习node的过程中,对于流的概念一直不是很理解,通过查阅一些资料,现在将自己对流的一些理解进行总结一下。

一.流的理解

首先我们必须知道什么是流,很多书中只是提到使用流读写文件怎么怎么方便,却不提流到底是什么?在说流之前我们先说一下流数据

流数据:就是字节数据,在应用程序中各种对象之间交换与传输数据的时候,总是先将该对象中所包含的数据转化为字节数据也就是流数据。再通过流的传输,到达目的对象后,再将流数据转化为该对象中可以使用的数据。

从上面可知,流就是用来传输流数据的,它是一种传输手段

流:在一个应用程序中,流是一组有序的,有起点和终点的字节数据(流数据)的传输手段

二.能够使用流的对象

从流的概念中我们可以知道流是用来传输流数据的,也就是说我们需要把其他的对象数据转化为流数据。

在Node中,使用了各种实现了stream.Readable接口的对象读取流。也就是说只有这些对象才能够读取流

Node.js中可以读取数据流的对象,列表如下:

对象 描述
fs.ReadStream 用于读取文件
http.IncomingMesage 代表客户端请求或服务端响应
net.Socket 代表一个socket端口对象
child.stdout 用于创建子进程的标准输出流
child.stderr 用于创建子进程的标准错误输出流
process.stdin 用于创建进程的标准输入流
Gzip 用于实现数据压缩

上面这些读取数据的对象将会触发的事件

事件名 描述
readable 当可以从流中读取数据时触发
data 当读取到来自文件,客户端,服务器端等对象的新的数据时触发
end 代表一个socket端口对象
child.stdout 当读取完所有的事件时触发,该事件的触发意味着data事件将不再被触发
err 当读取数据的过程中产生错误时触发
close 当用于读取数据的对象被关闭时触发,并非所有用于读取流数据的对象都会触发该事件

上面这些读取数据的对象所拥有的方法

在对象读取流的过程中,对象还拥有一些方法,可以对流进行一些操作,比如指定编码,指定流的传输目的地等。列表如下:

方法名 描述
read 用于读取数据
setEncoding 用于指定用什么编码方式读取数据
pause 用于通知对象停止触发data事件
resume 用于通知对象恢复触发data事件
pipe 用于设置一个数据通道,然后取出所有流数据并将其输出到通道另一端所指向的目标对象中
unpipe 用于取消pipe设置的通道

接下来使用fs模块中的createReadStream方法创建一个将文件读取为流数据的ReadStream对象,介绍一下流数据的读取。示例代码如下:

const fs = require('fs');

let file = fs.createReadStream('./data.txt');
// console.log(file); //得到的是一个ReadStream对象
//对象在读取文件时,需要先打开文件,打开文件会触发open事件
file.on('open',function(fd){
console.log('开始读取文件');
// console.log(fd);
});
//对象触发data事件,读取数据
file.on('data',function(data){
console.log('读取到数据');
console.log(data.toString());
});
//读取文件完毕,触发end事件
file.on('end',function(){
console.log('文件读取完毕');
});
//关闭文件,触发close事件
file.on('close',function(){
console.log('关闭文件')
});
file.on('error',function(err){
console.log(err)
});

上面介绍了Node.js中用于读取流的对象,以及在读取过程中,对象可能触发的事件以及调用的方法。下面介绍Node.js中用于写入流的对象,以及在写入过程中,这些对象可能触发的事件和调用的方法。

在Node.js中,使用各种实现了stream.Writable接口的对象来将流数据写入到对象中,所有这些对象都是继承了EventEmitter类的实例,在写入数据的过程中,将可能触发各种事件

各种用于写入流数据的对象,如下表所示:

对象 描述
fs.WriteStream 用于写入文件
http.ClientRequest 用于写入http客户端请求数据
http.ServerResponse 用于写入http服务端响应数据
net.Socket 代表一个socket端口对象
child.stdin 用于创建子进程的标准输入流
process.stderr 用于创建进程的标准错误输出流
process.stdout 用于创建进程的标准输出流
Gunzip 用于解压数据

这些对象将有可能触发的事件如下表所示:

事件名 描述
drain 当用于写入数据的write方法返回false之后触发
finish 当end方法被调用且数据被全部写入操作系统缓存区时触发
pipe 当用于读取数据的pipe方法被调用时触发
unpipe 当用于读取数据的pipe方法被调用时触发
error 当写入数据的过程中产生错误时触发

这些对象在写入数据的过程中,所拥有的方法如下表所示:

方法名 描述
write 用于写入有数据
end 当没有数据再被写入流中时调用该方法,这将迫使操作系统缓存区中的剩余

使用fs模块的createWriteStream方法创建一个将流数据写入文件的WriteStream对象。

const fs = require('fs');
let file = fs.createWriteStream('./result.txt');
file.write('hello Node.js',function(){
console.log('写入文件')
})

Node中流的概念的更多相关文章

  1. Node.js回调概念

    什么是回调? 回调是一个异步等效的功能.在完成特定任务回调函数被调用. Node大量使用了回调.Node的所有的API都支持回调这样的一种方式. 例如,一个函数读取一个文件可能开始读取文件,并使得下一 ...

  2. 《精通并发与Netty》学习笔记(09 - Java中流的概念)

    Java中流的概念 java程序通过流来完成输入/输出.流是生产或消费信息的抽象.流通过java的输入/输出与物理设备链接.尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式.这样,相同的输 ...

  3. Node.js的概念与应用

    转:http://blog.jobbole.com/100058/?utm_source=blog.jobbole.com&utm_medium=relatedPosts Node.js 是什 ...

  4. node.js基本概念简单解释

    1:什么是回调函数? 2:什么是同步异步 3:什么是I/O 4:什么是单线程/多线程 5:什么是阻塞/非阻塞 6:什么是事件 7:什么是事件驱动 8:什么是事件驱动的回调 9:什么是事件循环 解释: ...

  5. node(1) npm是什么?node的异步概念

    NPM是随同的NodeJS一起安装的包管理工具 他可以做什么? 1.可以从NPM服务器下载别人的东西使用 2.可以把自己的东西传到NPM服务器,让别人下载使用 淘宝的镜像会快一点      cnpm ...

  6. node开发基础概念

    1.以严格模式运行一个js文件 node --use_strict xxx.js 2.退出node交互模式 连续按两次Ctrl+C. 3,node.js的模块不支持ES6的export.import规 ...

  7. Java中流的概念

    http://wapwenku.baidu.com/view/04714847b307e87101f69656.html?ssid=0&from=1086k&uid=0&pu= ...

  8. 回忆一下Node(随时更改,想到什么写什么)

    什么是Node? Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效 事件驱动: 任务执行,发布者 ...

  9. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

随机推荐

  1. 二分查找算法的C++和PHP实现

    C++实现方式: #include<iostream> #include<stdlib.h>#include<algorithm> using namespace ...

  2. 使用Rapidxml读取xml文件

    现有xml文件如上,写在一个string中.需要获取节点上元素的类别和属性信息,并存储到结构体表中. 结构体如下: 得到的结果如下:

  3. Spring的断言工具类Assert的基本使用

    org.springframework.util.Assert; Assert工具类,通常用于数据合法性检查. 平时做判断通常都是这样写: if(message == null || message. ...

  4. python笔记:#001#python简介

    认识 Python 人生苦短,我用 Python -- Life is short, you need Python 目标 Python 的起源 为什么要用 Python? Python 的特点 Py ...

  5. cocos2d-x 欢乐捕鱼游戏总结

    这几天一直都在做一个捕鱼游戏Demo,大概花掉了我快一个礼拜的时间.游戏主体是使用的cocos2d-x高级开发教程里面提供的小部分框架基本功能.然后自己加入所有的UI元素和玩法.变成了一个体验不错的捕 ...

  6. JavaScript (一、ECMAScript )

    一.js简介和变量 1.JavaScript的概述组成和特点 a.JavaScript 是脚本语言,是世界上最流行的编程语言,这门语言可用于 HTML 和 web,更可广泛 用于服务器.PC.笔记本电 ...

  7. linux timerfd系列函数总结

    网上关于timerfd的文章很多,在这儿归纳总结一下方便以后使用,顺便贴出一个timerfd配合epoll使用的简单例子 一.timerfd系列函数 timerfd是Linux为用户程序提供的一个定时 ...

  8. 利用AOP实现SqlSugar自动事务

    先看一下效果,带接口层的三层架构: BL层: public class StudentBL : IStudentService { private ILogger mLogger; private r ...

  9. js算法初窥03(简单搜索及去重算法)

    前面我们了解了一些常用的排序算法,那么这篇文章我们来看看搜索算法的一些简单实现,我们先来介绍一个我们在实际工作中一定用到过的搜索算法--顺序搜索. 1.顺序搜索 其实顺序搜索十分简单,我们还是以第一篇 ...

  10. JS 总结----基础部分

    javascript基础:1.每个属性都可以加ID2.写函数的时候注意 == 和 = 不要写错了3.html里面怎么写js里面就怎么写,但是有一例外 className 比如oDiv.class = ...