在学习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. Android面试题摘录

    本文中面试题全部选自<精通Android>(英文名“Pro android 4”)一书的章后面试题,不过这套面试题与书中内容结合比较紧密,所以选择使用时请谨慎. ####C2:Androi ...

  2. Sina微博爬取@pyspider

    这是一篇不应该写的文章,都写了,针对特定“方式”的爬虫也就没法爬了. 1.模拟登录的一些文章: 解析新浪微博的登录过程(2013-12-23): http://www.cnblogs.com/houk ...

  3. ios WKWebView 与 JS 交互实战技巧

    一.WKWebView 由于Xcode8发布之后,编译器开始不支持iOS 7了,这样我们的app也改为最低支持iOS 8.0,既然需要与web交互,那自然也就选择使用了 iOS 8.0之后 才推出的新 ...

  4. 印钞机 V1.0(量化选基总结)

    今年的元旦,在家把之前手工的选基方法完全程序化了.这是我的"印钞机" V1.0. 为什么叫印钞机,详细情况可见下文及最后的总结. 量化选基成果 我的主要基金投资方法其实就是量化选基 ...

  5. HTML编码和CSS编码会遇到的问

    http://codeguide.bootcss.com/#html-syntax  参考链接 属性顺序 HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读性. class id, name ...

  6. httpd基础配置和虚拟主机的配置方法

    RedHat6.5  httpd实验的大概步骤 #解包 tar zxf httpd-2.2.17.tar.gz -C /usr/src#切换到目录 cd /usr/src/httpd-2.2.17/# ...

  7. git基础命令学习总结

    git版本升级 git clone git://git.kernel.org/pub/scm/git/git.git 列出所有 Git 当时能找到的配置 git config --list git c ...

  8. Python_自定义有向图

    directedGraph.py class DirectedGraph(object): def __init__(self,d): if isinstance(d,dict): self.__gr ...

  9. Java中判断是否为空的方法

    1.判断字符串或者对象是否为空 首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.ut ...

  10. 关于office在卸载了某一应用之后无法试图使用的功能所在的网络位置

    我出现这个问题是在卸载了某一个微软的办公软件之后,所有的办公软件都会产生这个问题. 处理的方法是将之前的安装包解压,然后找到所出现的msi文件,点击确定就ok了. 所以说,安装文件最好还是放在一个地方 ...