在学习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. java-将评论内容过滤特殊表情emoj符号,保存到mysql中

    正常操作评论,保存时,若评论内容含有特殊表情符号,后台将报错如下: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_ ...

  2. 万网主机使用wordpress发送邮件的方法

    今天弄了一下午总算明白了,这里写一下具体过程. 首先是邮箱,万网主机是不支持mail()函数的,所以默认的不可用,如果你想发送邮件的话,只能使用fsockopen()函数.首先进入万网主机管理平台,启 ...

  3. python3 爬取qq音乐作者所有单曲 并且下载歌曲

    1 import requests import re import json import os # 便于存放作者的姓名 zuozhe = [] headers = {'User-Agent': ' ...

  4. JS的进阶技巧

    前言 你真的了解JS吗,看完全篇,你可能对人生产生疑问. typeof typeof运算符,把类型信息当做字符串返回. //正则表达式 是个什么 ? typeof /s/ // object //nu ...

  5. 集群搭建(一)克隆虚拟机静态IP设置

    [抛出问题] 当在搭建集群的时候,我们会将一个安装好相关程序的虚拟机进行克隆,克隆之后,我们会发下一些问题:就是原先的eth0 网卡不见了 原先的网卡 而克隆之后的网卡 会发现原来的网卡eth0 变为 ...

  6. Object类的equals()方法总结

    1.equals()是Object中的方法,作用在于检测一个对象是否等于另一个对象. 2.在Object类中equals()方法是判断两个对象是否有相同的引用 ,即是否是相同的对象. 3.String ...

  7. C++相关:C++的IO库

    前言 基本的IO库设施 istream(输入流类型),提供输入操作. ostream(输出流类型),提供输出操作. cin,一个istream对象,从标准输入读取数据. cout,一个ostream对 ...

  8. Android的JDK、SDK、Eclipse的理解

    今天看了这方面的内容,感觉学到了一些东西: 首先,jdk是用来处理Java语言的, sdk是用来处理Java语言和硬件之间的关联的, eclipse是用来编写Java语言的, 通过对这方面的理解,加深 ...

  9. 监控与管理dubbo服务

    Dubbo是阿里多年前开源的一套服务治理框架,在众多互联网企业里应用广泛.本文介绍了一些如何监控与管理dubbo服务.使用的工具与<dubbox 的各种管理和监管>大致相同,本文更侧重于命 ...

  10. Spring提取@Transactional事务注解的源码解析

    声明:本文是自己在学习spring注解事务处理源代码时所留下的笔记: 难免有错误,敬请读者谅解!!! 1.事务注解标签 <tx:annotation-driven /> 2.tx 命名空间 ...