什么是Streams?
Streams是一些对象,可让您以连续的方式从源读取数据或将数据写入目标.在Node.js中,有四种类型的流 :
可读 : 用于读取操作的流.
可写 : 用于写操作的流.
Duplex : 流可以用于读写操作.
转换 : 一种双工流,其输出基于输入计算.
每种类型的流都是 EventEmitter instance并在不同的时间抛出几个事件.例如,一些常用事件是 :
数据 : 当有数据可供阅读时,会触发此事件.
结束 : 当没有更多数据需要阅读时,会触发此事件.
错误 : 当收到或写入数据有任何错误时会触发此事件.
完成 : 当所有数据都已刷新到底层系统时会触发此事件.
本教程提供对常用操作的基本了解. Streams.
从流中读取
创建一个名为input.txt的文本文件,其中包含以下内容 :
Tutorials Point is giving self learning contentto teach the world in simple and easy way!!!!!
使用以下代码创建名为main.js的js文件 :
var fs = require("fs");var data = '';// Create a readable streamvar readerStream = fs.createReadStream('input.txt');// Set the encoding to be utf8. readerStream.setEncoding('UTF8');// Handle stream events --> data, end, and errorreaderStream.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");
现在运行main.js查看结果 :
$ node main.js
验证输出.
Program EndedTutorials Point is giving self learning contentto teach the world in simple and easy way!!!!!
写入流
使用以下代码创建名为main.js的js文件 :
var fs = require("fs");var data = 'Simply Easy Learning';// Create a writable streamvar writerStream = fs.createWriteStream('output.txt');// Write the data to stream with encoding to be utf8writerStream.write(data,'UTF8');// Mark the end of filewriterStream.end();// Handle stream events --> finish, and errorwriterStream.on('finish', function() { console.log("Write completed.");});writerStream.on('error', function(err) { console.log(err.stack);});console.log("Program Ended");
现在运行main.js查看结果 :
$ node main.js
验证输出.
Program EndedWrite completed.
现在打开在当前目录中创建的output.txt;它应包含以下 :
Simply Easy Learning
管道Streams
管道是一种机制,我们提供一个流的输出作为另一个流的输入.它通常用于从一个流中获取数据并将该流的输出传递给另一个流.管道操作没有限制.现在我们将展示一个管道示例,用于从一个文件读取并将其写入另一个文件.
创建一个名为main.js的js文件,其中包含以下代码 :
var fs = require("fs");// Create a readable streamvar readerStream = fs.createReadStream('input.txt');// Create a writable streamvar writerStream = fs.createWriteStream('output.txt');// Pipe the read and write operations// read input.txt and write data to output.txtreaderStream.pipe(writerStream);console.log("Program Ended");
现在运行main.js查看结果 :
$ node main.js
验证输出.
Program Ended
打开当前目录中创建的output.txt;它应该包含以下 :
Tutorials Point is giving self learning contentto teach the world in simple and easy way!!!!!
链接流
链接是一种将一个流的输出连接到另一个流并创建链的机制多个流操作.它通常用于管道操作.现在我们将使用管道和链接来首先压缩文件然后解压缩.
使用以下代码创建名为main.js的js文件 :
var fs = require("fs");var zlib = require('zlib');// Compress the file input.txt to input.txt.gzfs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("File Compressed.");
现在运行main.js查看结果 :
$ node main.js
验证输出.
File Compressed.
您会发现input.txt已被压缩,并在当前目录中创建了一个文件input.txt.gz.现在让我们尝试使用以下代码解压缩同一个文件 :
var fs = require("fs");var zlib = require('zlib');// Decompress the file input.txt.gz to input.txtfs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("File Decompressed.");
现在运行main.js查看结果 :
$ node main.js
验证输出.
File Decompressed.