深入nodejs中流(stream)的理解

理解 Node.js 中的流(stream)非常重要,因为在处理大量数据或网络流时,流是一种高效而可靠的方式。本文将深入介绍 Node.js 中的流概念和使用方法,包括流的类型、创建和使用流、以及流的事件和操作。

流的类型

在 Node.js 中,流可以分为四类:

  1. 可读流(Readable Stream):从源头读取数据。
  2. 可写流(Writable Stream):向目标写入数据。
  3. 双工流(Duplex Stream):既可以读取数据也可以写入数据。常见的例子是 Socket。
  4. 转换流(Transform Stream):属于双工流的一种,会修改从源头读取的数据,再写入到目标中。常见的例子是 zlib 流,用于压缩和解压数据。

创建和使用流

要使用一个流,首先需要创建一个实例,并指定源头和目标(如果有的话)。例如,要创建一个可读流并从文件中读取数据,可以使用 fs.createReadStream(),如下所示:

const fs = require('fs');
const rs = fs.createReadStream('/path/to/file');

创建转换流和可写流的方法类似,分别使用 stream.Transformfs.createWriteStream,例如:

const stream = require('stream');
const ts = new stream.Transform();
const ws = fs.createWriteStream('/path/to/file');

流的事件和操作

创建流的实例后,可以使用事件来监听它的状态。

data 事件:当有数据可读时,会触发 data 事件,可以使用如下代码监听:

rs.on('data', function(chunk) {
  console.log(`Received ${chunk.length} bytes of data.`);
});

其他流事件还包括:end(数据读取完毕),error(发生错误)和 finish(数据写入完毕)。

有一些常见的流处理操作:

  1. pipe() 函数:将一个可读流连接到一个可写流中,自动调节速度和缓存,可实现高效处理大量数据,例如:

js
rs.pipe(ts).pipe(ws);

  1. unpipe() 函数:从目标中移除可读流,例如:

js
rs.unpipe(ts);

  1. pause()resume() 函数:分别暂停和恢复流的读写,例如:

js
rs.pause();
rs.resume();

示例说明

以下是两个使用流的示例:

示例一

在处理大型日志文件时,可以使用可读流逐行读取文件,并使用转换流来执行某些操作,而不必一次性将整个文件读入内存。例如,以下是用于处理日志文件的转换流示例:

class LogTransform extends stream.Transform {
  constructor(options) {
    super(options);
    this.tail = '';
  }
  _transform(chunk, encoding, callback) {
    const lines = (this.tail + chunk)
      .split('\n')
      .filter((line, index, array) => {
        return line.length > 0 || index < array.length - 1;
      });
    this.tail = lines.pop();
    lines.forEach(line => this.push(`${line}\n`));
    callback();
  }
  _flush(callback) {
    if (this.tail.length > 0) {
      this.push(`${this.tail}\n`);
    }
    callback();
  }
}

const fs = require('fs');
const rs = fs.createReadStream('/path/to/logfile');
const ts = new LogTransform();
rs.pipe(ts).pipe(process.stdout);

该转换流将文件转换成逐行格式,并将格式化后的数据写入输出流中,以便显示。在这个示例中,process.stdout 是指标准输出流(console.log 和 process.stdout.write 使用的流)。

示例二

在从网络中读取数据时,可以使用可读流和双工流的组合。例如,以下是使用 net 模块创建 TCP 服务器并处理客户端请求的示例:

const net = require('net');

const server = net.createServer(client => {
  console.log(`Client ${client.remoteAddress}:${client.remotePort} connected.`);
  const ts = new stream.Transform();
  ts._transform = (chunk, encoding, callback) => {
    const data = chunk.toString().toUpperCase();
    callback(null, data);
  };
  client.pipe(ts).pipe(client);
});

server.on('error', error => {
  console.error(`Server error: ${error.message}`);
});

server.listen(8888, () => {
  console.log(`Server listening on port ${server.address().port}...`);
});

当一个客户端连接到该服务器时,服务器会创建一个新的转换流,处理从客户端读取的数据,将它们转换为大写字母,并将结果返回给客户端。在这个示例中,“客户端”连接到同一台计算机的端口 8888。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入nodejs中流(stream)的理解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • TypeScript基本类型之typeof和keyof详解

    TypeScript基本类型之typeof和keyof详解 在TypeScript中,typeof和keyof是两个非常重要的基本类型运算符。typeof可用于获取变量的类型,而keyof可用于获取对象类型的键类型。 typeof typeof可用于获取变量的类型,其语法为: typeof x 这里的x可以是任意类型的变量、对象或函数,返回结果为x的类型。 …

    node js 2023年6月8日
    00
  • Node.js Streams文件读写操作详解

    Node.js Streams文件读写操作详解 简介 Streams是Node.js中非常强大的特性之一,它可以让你有效地处理数据流。它可以帮你增强你的Node.js应用的性能,减少内存消耗。在Node.js模块库中,有很多内置的Streams模块,比如http, fs和zlib等。 在本篇文档中,我们将会学习如何在Node.js中使用Streams来进行文…

    node js 2023年6月8日
    00
  • Sublime Text 3插件Minify的安装与使用(js代码压缩)

    下面是Sublime Text 3插件Minify的安装与使用攻略: 1. 安装Minify插件 在Sublime Text 3中安装插件可以通过Package Control来完成。如果你还没有安装它,请先安装Package Control插件,方法如下: 打开Sublime Text 3 按下Ctrl + ,(Windows)或⇧⌘P(Mac)打开命令面…

    node js 2023年6月8日
    00
  • vs code怎么搭建NodeJs的开发环境? vscode运行nodejs代码的技巧

    下面来详细讲解在 VS Code 中如何搭建NodeJs的开发环境,并介绍运行NodeJs代码的技巧。 搭建NodeJs的开发环境 步骤一:下载Node.js 下载Node.js最新版本,下载链接为:https://nodejs.org/en/download/ 步骤二:安装Node.js 安装Node.js,可以直接使用默认配置,一路“下一步”即可。 步骤…

    node js 2023年6月8日
    00
  • Postman xmysql不切换环境缓存数据到本地

    针对这个问题,我需要分几个方面来进行说明。 Postman 首先,我们需要了解一下Postman的基本使用,Postman是一款常用的API接口测试工具,可以模拟HTTP请求,方便我们对API进行接口测试。在使用Postman时,我们需要先创建一个环境变量,可以存储API接口中的一些参数,如URL、header参数和body参数等。创建好环境变量之后,我们可…

    node js 2023年6月8日
    00
  • JavaScript树形组件实现无限级树形结构

    以下是“JavaScript树形组件实现无限级树形结构”的完整攻略。 什么是树形结构? 树形结构是计算机科学中非常常见的一种数据结构,它类似于现实生活中的树,由一个根节点和多个子节点组成。树形结构具有递归的性质,每个节点都可以看作一个子树。 树形结构在网站中的应用 在网站中,我们会经常遇到需要展示树形结构的场景,比如商品分类、组织架构、地区选择等。为了方便展…

    node js 2023年6月8日
    00
  • 快速掌握Node.js模块封装及使用

    以下是“快速掌握Node.js模块封装及使用”的完整攻略,包括以下几个方面: 模块的基本概念: 在Node.js中,模块是代码的组织单元。一个模块通常包括一个或多个函数或对象的定义,可以在其他模块或应用程序中引用或调用。 Node.js支持CommonJS规范来定义和管理模块,通过require关键字引入其他模块,通过exports关键字导出当前模块的函数或…

    node js 2023年6月8日
    00
  • 使用 Node.js 实现图片的动态裁切及算法实例代码详解

    使用 Node.js 实现图片的动态裁切及算法实例代码详解 前言 本篇文档主要介绍如何使用 Node.js 实现图片的动态裁切,以及一些常见的算法实例代码。 步骤 1. 安装依赖 Node.js 使用第三方库 `sharp` 和 `request` 来进行图片处理和网络请求。在使用之前需要先安装这两个依赖: “`bash npm install sharp…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部