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

nodejs中 Stream 有四种流类型

Readable:可读操作

Writable:可写操作

Duplex:可读可写操作

Transform:操作被写入数据,然后读出结果

nodejs 中所有 Stream 对象都是EventEmitter的实例。常用的事件由:

data:当有数据可读时触发

end:没有更多的数据可读时触发

error:在接收和写入过程中发生错误的时候触发

finish:所有数据已被写入到底层系统的时候触发

从流中读取数据

创建input.txt文件,内容如下:谷歌网址:www.google.com

创建stream.js文件,代码如下:

  1. var fs = require("fs");
  2. var data = '';
  3.  
  4. // 创建可读流
  5. var readerStream = fs.createReadStream('input.txt');
  6.  
  7. // 设置编码为 utf8。
  8. readerStream.setEncoding('UTF8');
  9.  
  10. // 处理流事件 --> data, end, and error
  11. readerStream.on('data', function(chunk) {
  12. data += chunk; //读取过程中触发
  13. });
  14.  
  15. readerStream.on('end',function(){
  16. console.log(data); //读取完成后触发
  17. });
  18.  
  19. readerStream.on('error', function(err){
  20. console.log(err.stack); //读取出错时触发(如input.txt文件不存在)
  21. });
  22.  
  23. console.log("程序执行完毕");

结果:

  1. 程序执行完毕
  2. 谷歌网址:www.google.com

写入流

  1. var fs = require("fs");
  2. var data = '菜鸟教程官网地址:www.runoob.com';
  3.  
  4. // 创建一个可以写入的流,写入到文件 output.txt 中
  5. var writerStream = fs.createWriteStream('output.txt');
  6.  
  7. // 使用 utf8 编码写入数据
  8. writerStream.write(data,'UTF8');
  9.  
  10. // 标记文件末尾
  11. writerStream.end();
  12.  
  13. // 处理流事件 --> data, end, and error
  14. writerStream.on('finish', function() {
  15. console.log("写入完成。");
  16. });
  17.  
  18. writerStream.on('error', function(err){
  19. console.log(err.stack);
  20. });
  21.  
  22. console.log("程序执行完毕");

结果:

  1. 程序执行完毕
  2. 写入完成。

查看 output.txt 文件的内容:

  1. 菜鸟教程官网地址:www.runoob.com

管道流

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

这样就慢慢的实现了大文件的复制过程。

  1. var fs = require("fs");
  2.  
  3. // 创建一个可读流
  4. var readerStream = fs.createReadStream('input.txt');
  5.  
  6. // 创建一个可写流
  7. var writerStream = fs.createWriteStream('output.txt');
  8.  
  9. // 管道读写操作
  10. // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
  11. readerStream.pipe(writerStream);
  12.  
  13. console.log("程序执行完毕");

链式流

链式是通过连接输出流到另外一个流并创建多个对个流操作链的机制。链式流一般用于管道操作。

接下来我们就是用管道和链式来压缩解压文件。

压缩:

创建 compress.js 文件, 代码如下:

  1. var fs = require("fs");
  2. var zlib = require('zlib');
  3.  
  4. // 压缩 input.txt 文件为 input.txt.gz
  5. fs.createReadStream('input.txt')
  6. .pipe(zlib.createGzip())
  7. .pipe(fs.createWriteStream('input.txt.gz'));
  8.  
  9. console.log("文件压缩完成。");

代码执行结果如下:

  1. $ node compress.js
  2. 文件压缩完成。

执行完以上操作后,我们可以看到当前目录下生成了 input.txt 的压缩文件 input.txt.gz

解压

接下来,让我们来解压该文件,创建 decompress.js 文件,代码如下:

  1. var fs = require("fs");
  2. var zlib = require('zlib');
  3.  
  4. // 解压 input.txt.gz 文件为 input.txt
  5. fs.createReadStream('input.txt.gz')
  6. .pipe(zlib.createGunzip())
  7. .pipe(fs.createWriteStream('input.txt'));
  8.  
  9. console.log("文件解压完成。");

代码执行结果如下:

  1. $ node decompress.js
  2. 文件解压完成。

nodejs基础 -- Stream流的更多相关文章

  1. Java基础 | Stream流原理与用法总结

    Stream简化元素计算: 一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream: ...

  2. nodejs基础(管道、流)实现:复制、压缩、加密、解压,解密,写入文件

    stream流 都是events.EventEmitter的一个实例,都可以来创建自定义事件(也就是说,流是一个事件的实例) 在nodejs中 对http的请求与响应都是用流来实现的,请求就是一个输入 ...

  3. nodejs笔记之流(stream)

    nodejs的stream有四种流类型: 可读:Readable可写:Writable可读可写:Duplex操作被写入数据,然后读出结果:Transform常用事件:data:有数据可读时触发end: ...

  4. NodeJS Stream流

    NodeJS Stream流 流数据在网络通信中至关重要,nodeJS用Stream提供了一个抽象接口,node中有很多对象实现了这个接口,提供统一的操作体验 基本流类型 NodeJS中,Stream ...

  5. Java基础-IO流对象之字节流(Stream)

    Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...

  6. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  7. Java 8 新特性之 Stream 流基础体验

    Java 8 新特性之 Stream 流基础体验 package com.company; import java.util.ArrayList; import java.util.List; imp ...

  8. Java8的Stream流(一) --- 基础用法

    Java8中的Stream Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象. Stream的特性及优点: 无存储. Stream不是一种数据 ...

  9. java基础(10)---stream流

    一.stream的应用场景 for遍历的冗余场景:  stream的写法: 二.获取Stream流的常用方式 三.Stream的map映射方法 更简单的写法: 四.Stream的filter过滤方法 ...

随机推荐

  1. 2-String to Integer (atoi)

    实现atoi这个函数, public int atoi(String str),传入字符串str可以返回整数,请仔细考虑一下字符串的各种情况! String to Integer: Case分析 正常 ...

  2. unity, 延迟执行代码

    使用协程实现比较方便,可以带参数. void Start(){ StartCoroutine(delayLaunchRocket(rocket,2.0f)); } IEnumerator delayL ...

  3. Jenkins 使用学习笔记

    3.1    Jenkins安装    2 3.1.1    Jenkins下载    2 3.1.2    Jenkins 安装    2 3.1.3    Jenkins 目录结构    3 3. ...

  4. 如何设置Docker容器中Java应用的内存限制

    如果使用官方的Java镜像,或者基于Java镜像构建的Docker镜像,都可以通过传递 JAVA_OPTS 环境变量来轻松地设置JVM的内存参数.比如,对于官方Tomcat 镜像,我们可以执行下面命令 ...

  5. 使用C语言调用mysql数据库编程实战以及技巧

    今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...

  6. GCC中文错误提示

    最近在教人学c语言,英语不过关,想把ubuntu16.04的gcc改为中文提示,经查找后发现:目前(2016.8.5)基于gcc5.4版本的中文帮助好像还没有. 后来又仔细查找,现在最新的有中文的也就 ...

  7. mysql删除账户

    mysql> select user,host,password from user; +------+-----------+--------------------------------- ...

  8. Vmware-虚拟机中ubuntu不能联网问题的解决——NAT方式

    设置虚拟机不能联网是很痛苦的,这里我就ubuntu的NAT上网问题就个人经验讲一下,其他的桥连接等没有使用就没有经验了. 1.查看/设置下NAT的网络 打开VMware Workstation, 点击 ...

  9. 随笔记:Python于Windows下初实践,及使用Connector/Python连接MySQL

    有一同事要离职了,我负责交接一个用Python同步数据的项目. 之前木有做过Python,周休,做个简单的查询数据库,小练一下手. 包含: 安装 连接.查询MySQL 列表 元组 for循环 whil ...

  10. 09、win32 转换为 store app

    1.机制: 微软的 Project Centernial ( Project C) 项目的就是把传统的 windows桌面应用程序 转换为 windows10 store app (appx). 目的 ...