#########################################################################介绍
Node.js Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
    • Readable - 可读操作。
    • Writable - 可写操作。
    • Duplex - 可读可写操作.
    • Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
    • data - 当有数据可读时触发。
    • end - 没有更多的数据可读时触发。
    • error - 在接收和写入过程中发生错误时触发。
    • finish - 所有数据已被写入到底层系统时触发。

#############################################################################
从流中读取数据
read_source.txt:love A
####main.js

var fs = require('fs');
var data = '';
// 创建可读流
var readStream = fs.createReadStream('read_source.txt'); // 设置编码为 utf8
readStream.setEncoding('UTF8'); // 处理流事件 --> data, end, and error
readStream.on('data', function (chunk) {
data += chunk;
}); readStream.on('end', function () {
console.log(data);
}); readStream.on('error', function (err) {
console.log(err.stack)
}); console.log('程序执行完毕');

执行结果:
程序执行完毕
love A

#############################################################################
写入流

var fs = require('fs');
var data = 'love A'; // 创建写入流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据
writerStream.write(data, 'utf8'); // 标记文件末尾
writerStream.end(); // 处理流事件 --> finish and error
writerStream.on('finish', function () {
console.log('写入完毕');
}); writerStream.on('error', function (err) {
console.log(err.stack);
}); console.log('程序执行完毕');

执行结果:
程序执行完毕
写入完毕

###注意
创建写入流的时候,文件存在会覆盖原来文件。后面的例子也一样,是文件的部分,现在还没有学到那里,如果需要如何追加内容,按照Java的思路查找api文档

#############################################################################
管道流
管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中。

如上面的图片所示,我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。
以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

####实例

var fs = require('fs');

var readStream = fs.createReadStream('read_source.txt');
var writerStream = fs.createWriteStream('output2.txt'); // 管道读写操作
// 读取 read_source.txt 文件内容,并将内容写入到 output2.txt中
readStream.pipe(writerStream); console.log('程序执行完毕');

#############################################################################
链式流
链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。
接下来我们就是用管道和链式来压缩和解压文件。
###压缩
创建 compress.js 文件, 代码如下:

var fs = require('fs');
var zlib = require('zlib'); // 压缩 read_source.txt 成 read_source.txt.gz
var readStream = fs.createReadStream('read_source.txt');
var gzip = zlib.createGzip();
var writeStream = fs.createWriteStream('read_source.txt.gz'); readStream.pipe(gzip);
gzip.pipe(writeStream); console.log('文件压缩完成');

###解压
执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz。
接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:

var fs = require('fs');
var zlib = require('zlib'); // 解压 read_source.txt.gz 成 depress.txt
var readStream = fs.createReadStream('read_source.txt.gz');
var gunzip = zlib.createGunzip();
var writeStream = fs.createWriteStream('depress.txt'); readStream.pipe(gunzip);
gunzip.pipe(writeStream); console.log('文件解压完成');

内容来自:http://www.runoob.com/nodejs/nodejs-stream.html    +我的学习理解

9、Node.js Stream(流)的更多相关文章

  1. Node.js stream 流学习

    由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...

  2. Node.js Stream(流)

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

  3. 24.Node.js Stream(流)

    转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...

  4. [Node.js] Stream all things!

    Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...

  5. node.js 利用流实现读写同步,边读边写

    //10个数 10个字节,每次读4b,写1b let fs=require("fs"); function pipe(source,target) { //先创建可读流,再创建可写 ...

  6. Node.js Stream - 实战篇

    邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的 ...

  7. node.js stream

    stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口   一.nodejs stream类型 1. Readable - 可读操作. Writable ...

  8. node.js Stream Buffer FsPromise

    Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (re ...

  9. Node.js——Stream

    介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerRespo ...

随机推荐

  1. [PY3]——合并多个字典或映射(collections模块中的ChainMap 类)

    问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在. 解决方案 使用 collections 模块中的 ChainMap 类 Cha ...

  2. unity GUI Layout 组件(全)

    [expand 扩张][fitter 装配工] [envelope 信封,包装] Layout 布局 三种.   Horizontal Layout Group 水平布局 Padding:内边距,单位 ...

  3. 【我整理的java开源项目】

    摘要: 1. 整理出一些使用比较广或者个人觉得比较好的java开源项目和资料供参考. 2. 如果你觉得好但是我没有列出的开源项目请告诉我,方便我添加到列表里. 3. 如果你发现信息描述有误请联系我,我 ...

  4. hdu 3415 Max Sum of Max-K-sub-sequence 单调队列。

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  5. Bzoj3277:串

    题面 传送门 Sol 广义\(sam\) 每个\(sam\)的状态开\(set\)记录属于哪些串 \(parent\)树上启发式合并\(set\) 然后每个串就在上面走,通过不停地跳\(parent\ ...

  6. Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in

    学习php的命名空间,直接把手册的代码粘贴过来,却报错了:Fatal error: Namespace declaration statement has to be the very first s ...

  7. Word 关闭 Passive Voice

      Sheryl prefers passive voice for some of her writing (such as business documents and correspondenc ...

  8. Nginx采用yum安装方式及安装后的目录

    第一次写博客就不讲究格式了,纯文字了吧 开始 第一步先执行 rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release- ...

  9. maven(15),快照与发布,RELEASE与SNAPSHOT

     发布RELEASE 用户A将代码打包发布到RELEASE仓库,具体操作参考上篇文章.用户B使用时,需要在pom.xml添加JAR包的依赖坐标.如果用户A将版本从1.0升级为2.0,用户B使用时也 ...

  10. java 中sendredirect()和forward()方法的区别

     一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...