模块概览

nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。

对于大部分的nodejs开发者来说,平常并不会直接用到stream模块,只需要了解stream的运行机制即可(非常重要)。

而对于想要实现自定义stream实例的开发者来说,就得好好研究stream的扩展API了,比如gulp的内部实现就大量用到了自定义的stream类型。

来个简单的例子镇楼,几行代码就实现了读取文件内容,并打印到控制台:

const fs = require('fs');

fs.createReadStream('./sample.txt').pipe(process.stdout);

Stream分类

在nodejs中,有四种stream类型:

  • Readable:用来读取数据,比如 fs.createReadStream()
  • Writable:用来写数据,比如 fs.createWriteStream()
  • Duplex:可读+可写,比如 net.Socket()
  • Transform:在读写的过程中,可以对数据进行修改,比如 zlib.createDeflate()(数据压缩/解压)。

Readable Stream

以下都是nodejs中常见的Readable Stream,当然还有其他的,可自行查看文档。

  • http.IncomingRequest
  • fs.createReadStream()
  • process.stdin
  • 其他

例子一:

var fs = require('fs');

fs.readFile('./sample.txt', 'utf8', function(err, content){
// 文件读取完成,文件内容是 [你好,我是程序猿小卡]
console.log('文件读取完成,文件内容是 [%s]', content);
});

例子二:

var fs = require('fs');

var readStream = fs.createReadStream('./sample.txt');
var content = ''; readStream.setEncoding('utf8'); readStream.on('data', function(chunk){
content += chunk;
}); readStream.on('end', function(chunk){
// 文件读取完成,文件内容是 [你好,我是程序猿小卡]
console.log('文件读取完成,文件内容是 [%s]', content);
});

例子三:

这里使用了.pipe(dest),好处在于,如果源文件较大,对于降低内存占用有好处。

var fs = require('fs');

fs.createReadStream('./sample.txt').pipe(process.stdout);

注意:这里只是原封不动的将内容输出到控制台,所以实际上跟前两个例子有细微差异。可以稍做修改,达到上面同样的效果

var fs = require('fs');

var onEnd = function(){
process.stdout.write(']');
}; var fileStream = fs.createReadStream('./sample.txt');
fileStream.on('end', onEnd) fileStream.pipe(process.stdout); process.stdout.write('文件读取完成,文件内容是['); // 文件读取完成,文件内容是[你好,我是程序猿小卡]

Writable Stream

同样以写文件为例子,比如想将hello world写到sample.txt里。

例子一:

var fs = require('fs');
var content = 'hello world';
var filepath = './sample.txt'; fs.writeFile(filepath, content);

例子二:

var fs = require('fs');
var content = 'hello world';
var filepath = './sample.txt'; var writeStram = fs.createWriteStream(filepath);
writeStram.write(content);
writeStram.end();

Duplex Stream

最常见的Duplex stream应该就是net.Socket实例了,在前面的文章里有接触过,这里就直接上代码了,这里包含服务端代码、客户端代码。

服务端代码:

var net = require('net');
var opt = {
host: '127.0.0.1',
port: '3000'
}; var client = net.connect(opt, function(){
client.write('msg from client'); // 可写
}); // 可读
client.on('data', function(data){
// server: msg from client [msg from client]
console.log('client: got reply from server [%s]', data);
client.end();
});

客户端代码:

var net = require('net');
var opt = {
host: '127.0.0.1',
port: '3000'
}; var client = net.connect(opt, function(){
client.write('msg from client'); // 可写
}); // 可读
client.on('data', function(data){
// lient: got reply from server [reply from server]
console.log('client: got reply from server [%s]', data);
client.end();
});

Transform Stream

Transform stream是Duplex stream的特例,也就是说,Transform stream也同时可读可写。跟Duplex stream的区别点在于,Transform stream的输出与输入是存在相关性的。

常见的Transform stream包括zlibcrypto,这里举个简单例子:文件的gzip压缩。

var fs = require('fs');
var zlib = require('zlib'); var gzip = zlib.createGzip(); var inFile = fs.createReadStream('./extra/fileForCompress.txt');
var out = fs.createWriteStream('./extra/fileForCompress.txt.gz'); inFile.pipe(gzip).pipe(out);

相关链接

https://nodejs.org/api/stream.html

NodeJS学习笔记 (28)流操作-stream(ok)的更多相关文章

  1. NodeJS学习笔记 (2)文件系统操作-fs(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide/blob/master/%E6%A8%A1%E5%9D%97/fs.md#%E9%80%9A%E ...

  2. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  3. Nodejs学习笔记(四)——支持Mongodb

    前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...

  4. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  5. Nodejs学习笔记(十六)--- Pomelo介绍&入门

    目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...

  6. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  7. Nodejs学习笔记(十六)—Pomelo介绍&入门

    前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...

  8. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  9. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

随机推荐

  1. MHA+ProxySQL 读写分离高可用

    文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...

  2. 洛谷P2118 比例简化(暴力)

    题目描述 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902. 不过,如 ...

  3. Java绘图技术基础

    public class Demo1 extends JFrame{ MyPanel mp=null; public static void main(String[] args){ Demo1 de ...

  4. 改变GridView中列的宽度

    <asp:TemplateField HeaderText="规格型号" HeaderStyle-Width="24%">

  5. BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)

    题意 N<=500000 题解 维护一个set可以用堆来解决. #include<iostream> #include<cstring> #include<cstd ...

  6. js 判断是否滚动到底部

    $(window).scroll(function(){ var scrollTop = $(this).scrollTop(); //scrollTop() 方法返回或设置匹配元素的滚动条的垂直位置 ...

  7. 嵌入式表单字段中的内容可能被server更改以删除不安全的内容。是否要又一次载入您的页面以查看保存结果?

    嵌入式表单字段中的内容可能被server更改以删除不安全的内容.是否要又一次载入您的页面以查看保存结果?         近期有朋友问到,当他在SharePoint首页上进行编辑时.插入一段代码. 完 ...

  8. POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)

    题目链接:http://poj.org/problem? id=3368 Description You are given a sequence of n integers a1 , a2 , .. ...

  9. cocos2d_x_01_环境搭建

    终于效果图: Cocos2d-x-3.3 Mac 安装 下载地址: 參考文档:  在线API列表:  Cocos2d-x-3.3 版本号 从配置安装到创建项目都是命令行 官网下载最新版本号Cocos2 ...

  10. POJ 2739 Sum of Consecutive Prime Numbers(素数)

    POJ 2739 Sum of Consecutive Prime Numbers(素数) http://poj.org/problem? id=2739 题意: 给你一个10000以内的自然数X.然 ...