在学习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的笔记

    今天开始记录学习java的笔记,加油

  2. C++ 延时等待(sleep/timer/wait)

    原文链接:http://blog.csdn.net/tangweide/article/details/7063747 (-)使用_sleep()函数 #include <iostream> ...

  3. Centos 7安装python3

    纯傻瓜式步骤,保证成功. 下面的操作,按照步骤来就可以了,不要在中途cd 到别的文件目录下,要想查看效果可以用 lsj加上对应的目录,不需要切换进去. 首先不管你当前在哪个目录下,输入以下命令. [r ...

  4. [译文]Domain Driven Design Reference(一)—— 前言

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. DDD到目前为止知 ...

  5. C#备份及还原数据库的实现

    使用前要导入SQLDMO.dll 下载地址:http://down.51cto.com/data/853937 1.在用户的配置时,我们需要列出当前局域网内所有的数据库服务器,并且要列出指定服务器的所 ...

  6. python爬虫入门(七)Scrapy框架之Spider类

    Spider类 Spider类定义了如何爬取某个(或某些)网站.包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item). 换句话说,Spider就是您定义爬取的动作 ...

  7. eclipse maven 构建简单springmvc项目

    环境:eclipse Version: Oxygen.3a Release (4.7.3a) 创建maven Project项目,目录结构 修改工程的相关编译属性 修改pop.xml,引入spring ...

  8. linux ulimit 调优

    概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...

  9. Mysql 30条军规

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  10. Linux时间子系统之(三):用户空间接口函数

    专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...