NodeJS学习笔记 (28)流操作-stream(ok)
模块概览
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包括zlib
、crypto
,这里举个简单例子:文件的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);
相关链接
NodeJS学习笔记 (28)流操作-stream(ok)的更多相关文章
- 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 ...
- java 学习笔记之 流、文件的操作
ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...
- Nodejs学习笔记(四)——支持Mongodb
前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- Nodejs学习笔记(十六)—Pomelo介绍&入门
前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...
- Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...
- NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)
个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...
随机推荐
- JQuery中的时间和动画
我们知道JavaScript和HTML之间的交互是通过用户操作和浏览器成生成事件来完成的,比如当浏览钱加载完一个HTML文档或用户点击一个按钮都会生成一个事件,虽然利用传统的JavaScript事件可 ...
- IEEE Access的模板的问题
这个模板果然问题还是有一些,比如caption换行得自己改class文件.首先感谢一下CSDN的一位网友的经验https://blog.csdn.net/baidu_21381705/article/ ...
- 阿里巴巴和印度最大移动支付和商务平台Paytm
2015年9月29日,阿里巴巴和印度最大移动支付和商务平台Paytm发布联合声明,宣布阿里巴巴集团及其旗下金融子公司蚂蚁金服将向Paytm注入新资金.阿里称这是一项“战略性的”投资. 蚂蚁金服已经在2 ...
- 【原创】关于JMS[1]
面向消息中间件(MOM)为分布式系统提供异步,解耦,稳定,可扩展和安全的行为.MOM在分布式计算领域是一个重要的概念.它允许应用使用代理器API在分布式环境实现各种功能.Java消息服务(Java M ...
- Eclipse schema xml提示
步骤一:确定xsd文件位置 spring-framework-3.2.0.RELEASE\schema\beans 步骤二:复制路径 步骤三:搜索“xml catalog” 步骤四:添加约束提示 ...
- 搭建rsync实时同步
1.本实验基于centos6.5服务器做的 cat cat /etc/redhat-release 2.在配置环境之前需要先将服务器自带的rsync卸除 yum -y remove rsync* 3. ...
- Linux Kernel 5.1 RC5发布
我们距离正式的Linux 5.1内核发布还有不到一个月的时间,而今天Linus Torvalds宣布推出预期的Linux Kernel 5.1 RC5版本.Linus Torvalds专门评论了Lin ...
- caioj 1157 线性筛选素数
注意这道题开得非常大,有2*1e7 自己可以养成一种习惯,如果数据是很容易的话,可以自己手动输入极限数据来测试自己的程序 #include<cstdio> #include<algo ...
- HTTP——状态码
(转载) 完整的 HTTP 1.1规范说明书来自于RFC 2616,你可以在http://www.talentdigger.cn/home/link.php?url=d3d3LnJmYy1lZGl0b ...
- 【转载】Failed to load class "org.slf4j.impl.StaticLoggerBinder".问题解决
在进行hibernate配置好后运行测试类的时候出现: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" ...