9、Node.js Stream(流)
#########################################################################介绍
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(流)的更多相关文章
- Node.js stream 流学习
由于node.js 创建http 是这样的 http.createServer(function(request,response){}).listen(2000); 里面的request 就是rea ...
- Node.js Stream(流)
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...
- 24.Node.js Stream(流)
转自:http://www.runoob.com/nodejs/nodejs-stream.html Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- [Node.js] Stream all things!
Node.js come alone with many Stream API. Stream is useful when handling large trunck of data. For ex ...
- node.js 利用流实现读写同步,边读边写
//10个数 10个字节,每次读4b,写1b let fs=require("fs"); function pipe(source,target) { //先创建可读流,再创建可写 ...
- Node.js Stream - 实战篇
邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的 ...
- node.js stream
stream是一个接口,流是可以从一个读取或写入数据的目标对象 ,Node 中有很多对象实现了这个接口 一.nodejs stream类型 1. Readable - 可读操作. Writable ...
- node.js Stream Buffer FsPromise
Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (re ...
- Node.js——Stream
介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerRespo ...
随机推荐
- AutoDetectChangesEnabled及AddRange解决EF插入的性能问题
转自:http://www.cnblogs.com/nianming/archive/2013/06/07/3123103.html#2699851 记录下. 园友莱布尼茨写了一篇<Entity ...
- Java测试各种数据库连接(用Connection类)
源代码: package cn.finedo.fdcollect_service.util; import java.sql.Connection; import org.apache.logging ...
- 【转】如何在ASP.NET 2.0中定制Expression Builders
expressions是asp.net 2.0中的新特色,它可以使你在asp.net的页面里很方便的使用自定义的属性. 在ASPX页里只要使用$符号就可以访问到,你定制的属性了. 例如我们看个例子: ...
- 推荐网站 explainshell.com
ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...
- jquery 选择唯一值 选择器“”非“用法
$(document).ready(function () { $("#addwork").hide(); $(".xi").click(function(){ ...
- Linux安装AUTOCONF和AUTOMAKE产生的程序的一般步骤
概述: 在Linux下安装一个应用程序时, 一般先运行脚本configure, 然后用make来编译源程序, 在运行make install, 最后运行make clean删除一些临时文件. 相关点的 ...
- 再说优化MySQL索引
这几天开发尤其重视数据库索引的优化,是一件好事情,开发特意提过来几个要删除的索引,oh!我的佛陀呀!历史上出现过因为评估不到位,删索引引发故障的案例.那么有什么办法可以评估索引是否合理呢? perco ...
- SSIS教程:创建简单的ETL包 -- 6. 对项目部署模型使用参数(Using Parameters with the Project Deployment Model)
在本课中,将修改在第 5 课: 添加包部署模型的包配置中创建的包,以便使用项目部署模型.您将使用一个参数替换该配置值,以便指定示例数据位置.还可以复制本教程附带的已完成的 Lesson 5 包. 使用 ...
- JDBC的DAO设计模式
在javaEE中,java类的属性通过getter和setter来定义,get(或set)方法去除get(set)后,首字母小写即为Java类的属性.操作java类的属性有一个工具包,BeanUtil ...
- webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...