Node.js:Stream(流)

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

  Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

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

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。

一、从流中读取数据

var fs = require("fs");
var data = ‘‘;

// 创建可读流
var readerStream = fs.createReadStream(‘input.txt‘);

// 设置编码为 utf8。
readerStream.setEncoding(‘UTF8‘);

// 处理流事件 --> data, end, and error
readerStream.on(‘data‘, function(chunk) {
   data += chunk;
});

readerStream.on(‘end‘,function(){
   console.log(data);
});

readerStream.on(‘error‘, function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

  结果:程序执行完毕,接着打印input.txt里面内容

二、写入流

var fs = require("fs");
var data = ‘百度:www.baidu.com‘;

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream(‘output.txt‘);

// 使用 utf8 编码写入数据
writerStream.write(data,‘UTF8‘);

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on(‘finish‘, function() {
    console.log("写入完成。");
});

writerStream.on(‘error‘, function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

  结果就是创建了该文件,将 data 变量的数据写入到 output.txt 文件中

三、管道流

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

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

  以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream(‘input.txt‘);

// 创建一个可写流
var writerStream = fs.createWriteStream(‘output.txt‘);

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

  查看 output.txt 文件的内容变成了 input.txt 里面的内容(注意:会把output里面的原内容全部覆写)

四、链式流

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

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

var fs = require("fs");
var zlib = require(‘zlib‘);

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream(‘input.txt‘)
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream(‘input.txt.gz‘));

console.log("文件压缩完成。");

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

  接下来,让我们来解压该文件

var fs = require("fs");
var zlib = require(‘zlib‘);

// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream(‘input.txt.gz‘)
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream(‘inputtest.txt‘));

console.log("文件解压完成。");

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

五、补充笔记

  我现在又这么一个需求,我想把input里面的内容写到outInput里面去,但是上面的方法都是把文档里面的内容重置了,我只想添加,而且保留原内容怎么办呢?

  总结了2种方式:

1、存在覆盖状态,可以设置写入流的追加参数来解决

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream(‘input.txt‘);

// 创建一个可写流
//设置第二个参数append
var writerStream = fs.createWriteStream(‘output.txt‘,{ ‘flags‘: ‘a‘ });

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

2、可以在可读流创建完毕的回调函数里面进行操作,看代码:

let fs = require(‘fs‘);
let data = ‘‘;
let data2 = ‘你的小青蛙是真的可爱‘;
//1.读取流
//创建可读流
let readStream = fs.createReadStream("input.txt");
//设置utf-8编码
readStream.setEncoding(‘UTF8‘);
//处理流事件
readStream.on(‘data‘, chunk => data += chunk);
readStream.on(‘end‘, () => writeS(data));
readStream.on("error", err => console.log(err.strck));
console.log("程序1执行完毕");
//2.写入流
//创建可写流
let writeS = dataS =>{
    let writeStream = fs.createWriteStream("outInput.txt");
    //使用utf-8写入流
    writeStream.write(data2+dataS, "UTF8");
    //标记文件末尾
    writeStream.end();
    //处理事件流
    writeStream.on("finish", () => console.log("写入完成"));
    writeStream.on("error", err => console.log(err.stack));
    console.log("程序2执行完毕");
}

原文地址:https://www.cnblogs.com/goloving/p/9011690.html

时间: 2024-11-05 23:34:53

Node.js:Stream(流)的相关文章

Node.js Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 Stream 对象都是 EventEmitter 的实例.常用的事件有: data - 当有数据可读时触发.

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

//10个数 10个字节,每次读4b,写1b let fs=require("fs"); function pipe(source,target) { //先创建可读流,再创建可写流 //先读一次,rs.on(data) //将读到的类容写入目标中 ,返回布尔值,如果是ture,继续写,默认情况应该是false,暂停读取 //ws.on('drain'),抽干后,回复读取 //监听读取文件完毕后,关闭读取rs.on('end') let rs=fs.createReadStream(s

201902161119_《Node.js之流(Stream)一二事(1)》

... 1. 相比fs.readFile();  fs.createReadStream();分段读取更利于读文件, 可以读取4G文件, 前者方法的话buffer溢出 2. stream的end和close有区别, 前者是资源没了,后者是破坏资源流(文件pipe)的"管子" 3.  A.pipe(B); //  相当于 A | B, 从A到B 4. ... 原文地址:https://www.cnblogs.com/beesky520/p/10387135.html

[Node.js]Stream

摘要 Stream是一个抽象接口,Node中有很多对象实现了这个接口.例如,对http服务器发送请求的request对象就是一个Stream. Stream Stream有四种流类型: Readable:可读操作. Writable:可写操作. Duplex:可读写操作. Transform:操作被写入数据,然后读出结果. 所有Stream对象都是EventEmitter的实例,常用的事件: data:当有数据可读时触发. end:没有更多的数据可读时触发. error:在接收和写入过程中发生错

Node.js Stream - 实战篇

邹斌 ·2016-07-22 11:04 背景 前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介绍如何使用管道进行程序设计,主要内容包括: 管道的概念 Browserify的管道设计 Gulp的管道设计 两种管道设计模式比较 实例 Pipeline 所谓“管道”,指的是通过a.pipe(b)的形式连接起来的多个Stream对象的组合. 假如现在有两个Transform:bold和red,分别可将文本流中某些关键字加粗和飘红.可以按下面的方式对文本同时加粗和飘红: //

node.js Stream Buffer FsPromise

Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (require('stream').Writable)(); rs._read=function(){ this.push('send a msn for the first time'); this.push('send a msn for the second time'); this.push(n

Node.js——Stream

介绍 文件流:我们一般对大一点的文件实现stream的方式进行操作 http:显然http.createServer创建过程中的IncomingMessage实现了可读流的接口,ServerResponse实现了可写流的借口 文件流 写入流的close事件,必须通过ws.end() 方法来调用 文件的默认是flags是w,这是覆盖操作,追加的话是a var fs = require('fs') var rs = fs.createReadStream('./a.txt') var ws = fs

Node.js Stream-基础篇

Node.js Stream - 基础篇 邹斌 ·2016-07-08 11:51 背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务.譬如,shell通过管道|连接各部分,其输入输出的规范是文本流. 在Node.js中,内置的Stream模块也实现了类似功能,各部分通过.pipe()连接. 鉴于目前国内系统性介绍Stream的文章较少,而越来越多的开源工具都使用了Stream,本系列文章将从以下几方面来介绍相关内

清晰地去看 Node.js(二)

比较缓冲器拷贝缓冲区 路由指的就是我们要针对不同的URL有不同的处理方式,例如处理/start的业务逻辑和处理/upload模块 的业务:逻辑就 是不一致的. Node.js 模块系统:http://www.shouce.ren/api/view/a/3470 代码区: /** * 比较缓冲器 * buf1.compare(buf2); */ var buffer1 = new Buffer('ABC'); var buffer2 = new Buffer('ABCD'); var result

Node.js 中流操作实践

本文节选自 Node.js CheatSheet | Node.js 语法基础.框架使用与实践技巧,也可以阅读 JavaScript CheatSheet 或者 现代 Web 开发基础与工程实践 了解更多 JavaScript/Node.js 的实际应用. Stream 是 Node.js 中的基础概念,类似于 EventEmitter,专注于 IO 管道中事件驱动的数据处理方式:类比于数组或者映射,Stream 也是数据的集合,只不过其代表了不一定正在内存中的数据..Node.js 的 Str