栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【Node】Node.js数据流(Stream接口 fs模块)

【Node】Node.js数据流(Stream接口 fs模块)

数据流
  • 1 什么是数据流?
  • 2 数据流

1 什么是数据流?
  • “数据流”(stream)是处理系统缓存的一种方式。
  • 操作系统采用数据块(chunk)的方式读取数据,每收到一次数据,就存入缓存。
  • 数据读写可以看作是事件模式(Event)的特例,不断发送的数据块好比一个个的事件。读数据是read事件,写数据是write事件,而数据块是事件附带的信息。Node 为这类情况提供了一个特殊接口Stream

Node应用程序缓存的处理方式:

  • 等到所有数据接收完毕,一次性从缓存读取,这就是传统的读取文件的方式。这种方式先将数据全部读入内存,然后处理,优点是符合直觉,流程非常自然,缺点是如果遇到大文件,要花很长时间,才能进入数据处理的步骤。
  • 采用“数据流”的方式,收到一块数据,就读取一块,即在数据还没有接收完成时,就开始处理它。这种方式每次只读入数据的一小块,像“流水”一样,每当系统读入了一小块数据,就会触发一个事件,发出“新数据块”的信号。应用程序只要监听这个事件,就能掌握数据读取的进展,做出相应处理,这样就提高了程序的性能。
2 数据流

流是可以从一个源读取或写入数据到连续的目标对象。

在Node.js,有四种类型的数据流。

  • Readable - 其是用于读操作。
  • Writable - 用在写操作。
  • Duplex - 其可以用于读取和写入操作。
  • Transform - 输出基于输入的地方进行计算的一种双相流。

每种类型的流是一个EventEmitter实例,并抛出的不同的事件。

常用的事件有:

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

从流中读取:fs模块的createReadStream()方法,就可以创建一个读取数据的数据流。

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

// 建立一个输入流
var readerStream = fs.createReadStream('./input.txt');
// 设置字符集. 
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("Program Ended");

写入流:fs模块(内置了stream模块)的createWriteStream()方法,就可以创建一个写数据的数据流。

var fs = require("fs");
var data = '德云IT学院';

// 创建一个写入流
var writerStream = fs.createWriteStream('./output.txt');
// 设置写入数据的字符集
writerStream.write(data,'UTF8');
//文件结束退出
writerStream.end();
// 绑定流事件 --> finish, and error
writerStream.on('finish', function() {
    console.log("Write completed.");
});
writerStream.on('error', function(err){
   console.log(err.stack);
});
console.log("Program Ended");

管道流:管道是供一个流的输出作为输入到另一个流的机制。它通常被用于从一个流中获取数据,并通过该流输出到另一个流。

eg:一个管道从一个文件中读取和写入到另一个文件
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("Program Ended");

链式流:链式是一个机制,一个流的输出连接到另一个流,并创建一个链多流操作。它通常用于管道的操作。

eg:使用管道和链接先压缩文件,然后解压缩

压缩文件
var fs = require("fs");
var zlib = require('zlib');

// 将input.txt文件压缩为input.txt.zip
fs.createReadStream('./input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('./input.txt.zip'));
console.log("File Compressed.");



解压文件
var fs = require("fs");
var zlib = require('zlib');

// 解压文件input.txt.zip到demo.txt
fs.createReadStream('./input.txt.zip')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('./demo.txt'));
  
console.log("File Decompressed.");

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281505.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号