- Node.js 教程
- Node.js - 主页
- Node.js - 简介
- Node.js - 环境设置
- Node.js - 第一个应用程序
- Node.js - REPL 终端
- Node.js - 包管理器 (NPM)
- Node.js - 回调概念
- Node.js - 事件循环
- Node.js - 事件发射器
- Node.js - 缓冲区
- Node.js - 流
- Node.js - 文件系统
- Node.js - 全局对象
- Node.js - 实用模块
- Node.js - Web 模块
- Node.js - Express 框架
- Node.js - RESTFul API
- Node.js - 扩展应用程序
- Node.js - 打包
- Node.js - 内置模块
- Node.js 有用资源
- Node.js - 快速指南
- Node.js - 有用的资源
- Node.js - 讨论
Node.js - 流
什么是流?
流是允许您以连续方式从源读取数据或将数据写入目标的对象。在 Node.js 中,有四种类型的流 -
可读- 用于读取操作的流。
可写- 用于写入操作的流。
双工- 可用于读取和写入操作的流。
变换- 一种双工流,其中输出是根据输入计算的。
每种类型的 Stream 都是一个EventEmitter实例,并在不同的时间实例抛出多个事件。例如,一些常用的事件是 -
data - 当有数据可供读取时会触发此事件。
end - 当没有更多数据可供读取时触发此事件。
error - 当接收或写入数据出现任何错误时会触发此事件。
finish - 当所有数据都已刷新到底层系统时触发此事件。
本教程提供对 Streams 上常用操作的基本了解。
从流中读取
创建一个名为 input.txt 的文本文件,其内容如下 -
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
使用以下代码创建一个名为 main.js 的 js 文件 -
var fs = require("fs"); var data = ''; // Create a readable stream var readerStream = fs.createReadStream('input.txt'); // Set the encoding to be utf8. readerStream.setEncoding('UTF8'); // Handle stream events --> 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");
现在运行 main.js 来查看结果 -
$ node main.js
验证输出。
Program Ended Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
写入流
使用以下代码创建一个名为 main.js 的 js 文件 -
var fs = require("fs"); var data = 'Simply Easy Learning'; // Create a writable stream var writerStream = fs.createWriteStream('output.txt'); // Write the data to stream with encoding to be utf8 writerStream.write(data,'UTF8'); // Mark the end of file writerStream.end(); // Handle stream events --> finish, and error writerStream.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 Ended Write completed.
现在打开在当前目录中创建的output.txt;它应该包含以下内容 -
Simply Easy Learning
通过管道传输流
管道是一种机制,我们将一个流的输出作为另一个流的输入。它通常用于从一个流获取数据并将该流的输出传递到另一个流。管道操作没有限制。现在我们将展示一个从一个文件读取并将其写入另一个文件的管道示例。
使用以下代码创建一个名为 main.js 的 js 文件 -
var fs = require("fs"); // Create a readable stream var readerStream = fs.createReadStream('input.txt'); // Create a writable stream var writerStream = fs.createWriteStream('output.txt'); // Pipe the read and write operations // read input.txt and write data to output.txt readerStream.pipe(writerStream); console.log("Program Ended");
现在运行 main.js 来查看结果 -
$ node main.js
验证输出。
Program Ended
打开在当前目录中创建的output.txt;它应该包含以下内容 -
Tutorials Point is giving self learning content to 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.gz fs.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.txt fs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("File Decompressed.");
现在运行 main.js 来查看结果 -
$ node main.js
验证输出。
File Decompressed.