NodeJS 中Stream 的基本使用

NodeJS中Stream是一种非常重要的数据处理工具,它可以帮助我们高效地处理大量数据,在文件读写、网络传输等多个场景下都有广泛应用。下面我们来详细讲解NodeJS中Stream的基本使用。

什么是Stream

流(Stream)是Node.js中处理流式数据的一个抽象接口。Stream有四种类型:Readable、Writable、Duplex、Transform。在Stream中,数据是以块(chunk)为单位流动的,而不是一次性将所有数据读取到内存中。这使得在读写大量数据时不会因为内存不足而出现问题。

在Node.js中,大多数的核心API都提供了Stream的支持,比如文件读写和网络传输等。除此之外,我们也可以自定义Stream来满足特定的需求。

Stream的基本用法

创建Readable Stream

使用fs.createReadStream()来创建一个Readable Stream来读取文件的内容。

const fs = require('fs');

const readStream = fs.createReadStream('./example.txt');

readStream.on('data', (chunk) => {
  console.log(chunk.toString());  // 输出读取到的数据块
});

readStream.on('end', () => {
  console.log('读取完成');
});

readStream.on('error', (err) => {
  console.error('发生错误', err);
});

上面的代码中,我们通过fs.createReadStream()方法读取了当前目录下的example.txt文件,并将其转换为一个可读流(Readable Stream)。然后,我们通过readStream.on('data', ...)监听了data事件,当数据块可读取时触发该事件,我们将读取到的数据块输出到控制台。readStream.on('end', ...)监听end事件,当所有数据块读取完毕时触发该事件,我们输出"读取完成"的信息。readStream.on('error', ...)监听error事件,当读取过程中发生了错误时触发该事件,我们将错误信息输出到控制台。

我们也可以通过继承Readable类来创建自定义的可读流。

const { Readable } = require('stream');

class MyReadable extends Readable {
  constructor(options) {
    super(options);
    this.data = ['a', 'b', 'c'];
  }

  _read() {
    if (!this.data.length) {
      this.push(null);
    } else {
      this.push(this.data.shift());
    }
  }
}

const myReadable = new MyReadable();

myReadable.on('data', (chunk) => {
  console.log(chunk.toString());
});

myReadable.on('end', () => {
  console.log('读取完成');
});

myReadable.on('error', (err) => {
  console.error('发生错误', err);
});

上面的代码中,我们通过继承Readable类创建了一个自定义的可读流MyReadable,并在构造函数中初始化了一个字符串数组data来表示数据源。我们重写了MyReadable_read()方法,每次调用该方法时,我们将data数组中的一个元素推到流中,推完后从数组中删除该元素。当没有数据可以推送时,我们通过调用this.push(null)来告诉流读取结束。

创建完成后,我们通过myReadable.on('data', ...)监听data事件,当数据块可读取时触发该事件,我们将读取到的数据块输出到控制台。myReadable.on('end', ...)监听end事件,当所有数据块读取完毕时触发该事件,我们输出"读取完成"的信息。myReadable.on('error', ...)监听error事件,当读取过程中发生了错误时触发该事件,我们将错误信息输出到控制台。

创建Writable Stream

使用fs.createWriteStream()来创建一个Writable Stream来写入文件的内容。

const fs = require('fs');

const writeStream = fs.createWriteStream('./example.txt');

writeStream.write('Hello, World!\n');
writeStream.write('Hello, Node.js!\n');
writeStream.end('End of file.');

writeStream.on('finish', () => {
  console.log('写入完成');
});

writeStream.on('error', (err) => {
  console.error('发生错误', err);
});

上面的代码中,我们通过fs.createWriteStream()方法创建可写流(Writable Stream)并指定要写入的文件。然后,我们通过writeStream.write()方法向流中写入一些数据,并在最后通过writeStream.end()方法告诉流写入结束。注意,如果不调用writeStream.end()方法,流将不会结束,也就不会触发finish事件。最后,我们通过writeStream.on('finish', ...)监听finish事件,当所有数据块写入完成时触发该事件,我们输出"写入完成"的信息。writeStream.on('error', ...)监听error事件,当写入过程中发生了错误时触发该事件,我们将错误信息输出到控制台。

我们也可以通过继承Writable类来创建自定义的可写流。

const { Writable } = require('stream');

class MyWritable extends Writable {
  constructor(options) {
    super(options);
    this.data = '';
  }

  _write(chunk, encoding, callback) {
    this.data += chunk.toString();
    callback();
  }
}

const myWritable = new MyWritable();

myWritable.write('Hello, World!\n');
myWritable.write('Hello, Node.js!\n');
myWritable.end('End of file.');

myWritable.on('finish', () => {
  console.log(myWritable.data);
  console.log('写入完成');
});

myWritable.on('error', (err) => {
  console.error('发生错误', err);
});

上面的代码中,我们通过继承Writable类创建了一个自定义的可写流MyWritable。在构造函数中,我们初始化了一个字符串data来表示写入的内容。我们重写了MyWritable_write()方法,该方法会在每次写入数据时被调用,我们将写入的数据块转换为字符串,并拼接到data字符串中。当所有数据块写入完毕时,我们通过调用callback()告诉流本次写入完成。最后,我们通过myWritable.on('finish', ...)监听finish事件,当所有数据块写入完成时触发该事件,我们输出写入的内容和"写入完成"的信息。myWritable.on('error', ...)监听error事件,当写入过程中发生了错误时触发该事件,我们将错误信息输出到控制台。

结语

以上就是NodeJS中Stream的基本使用方法。通过学习这些内容,我们可以使用Stream高效地处理大量数据。如果你还想进一步了解Stream的详细内容和使用方法,可以参考Node.js官方文档。

阅读剩余 67%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS 中Stream 的基本使用 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python数据分析pandas模块用法实例详解

    Python数据分析pandas模块用法实例详解 介绍 本文将详细讲解Python中用于数据分析的pandas模块的用法和实例,并提供代码示例。 pandas是一个强大的Python数据分析工具,它能够帮助用户轻松地处理数据集和数据分析。 安装 在安装pandas之前,需要安装Python。如果你还没有安装Python,请先安装Python。然后,可以使用下…

    python 2023年5月14日
    00
  • Python 数据处理库 pandas 入门教程基本操作

    Python数据处理库pandas入门教程基本操作 简介 pandas是Python中一种很流行的数据处理库,既拥有NumPy数组的高性能计算特性,又具备Excel表格和SQL数据库的灵活性与可操作性,是进行数据清洗、分析、转换等操作的必备利器。本文将通过一些基本操作的实例来帮助读者入门pandas。 安装 在开始使用pandas之前应该先安装它。可以通过p…

    python 2023年5月14日
    00
  • pandas pd.cut()与pd.qcut()的具体实现

    当我们需要将连续性数据进行离散化时,pandas中提供了两个方法pd.cut()和pd.qcut()。pd.cut()是基于指定的区间对数据进行划分,而pd.qcut()则是面向数据分布的方式进行划分。下面将具体介绍这两个方法的使用。 pd.cut() 基本结构 pandas.cut(x, bins, right=True, labels=None, ret…

    python 2023年5月14日
    00
  • pandas行和列的获取的实现

    当使用 Pandas 处理数据时,我们可以使用不同的方法来获取行和列。下面是一些常见的方法: 获取列 通过列名获取指定列 要使用 Panda 获取 DataFrame 中的某个列,请使用 DataFrame 的列名进行索引: # 创建一个 DataFrame import pandas as pd data = {‘name’: [‘Amy’, ‘Bob’,…

    python 2023年5月14日
    00
  • python 如何设置柱状图参数

    下面是关于 Python 中设置柱状图参数的完整攻略: 1. 导入需要的库 在使用任何 Python 库前,我们都需要先导入它们。对于绘制柱状图,我们需要导入 matplotlib 库。 import matplotlib.pyplot as plt 2. 准备数据 在绘制柱状图前,我们需要准备好要绘制的数据。以一个地区的温度为例: region = [‘B…

    python 2023年6月14日
    00
  • 如何根据列值从数据框架中选择行

    对于从数据框中选择一部分数据这类操作,可通过行索引(row index)和列索引(column index)来实现。在数据框中,行是观测值,列是特征,选择行有助于剖析数据,查看数据中的趋势和模式。 选择行的方法 使用行号(row number):使用DataFrame的iloc方法,通过对行号进行选择。 使用标签(row label):使用DataFrame…

    python-answer 2023年3月27日
    00
  • Python的这些库,你知道多少?

    Python的这些库,你知道多少? Python拥有非常强大且丰富的标准库,此外还有众多第三方库也逐渐流行起来。在本文中,我们将介绍一些Python常用的库及其用法。 一、数据处理类库 NumPy NumPy 是 Python 中做科学计算的基础库。它提供了数组(ndarray)这个数据结构、数组运算、整形、随机数生成等科学计算中常用的基本功能。可以说,在很…

    python 2023年5月14日
    00
  • Pandas描述性统计常用的方法

    什么是描述性统计? 描述统计学(descriptive statistics)是一门统计学领域的学科,是一种利用某些指标对数据进行概括和描述的一种统计方法。 描述性统计通过统计数据的集中趋势、离散程度、分布形态、相关性等特征来描述数据的基本情况和规律,常用于数据分析、数据挖掘、商业分析等领域。常见的描述性统计指标包括均值、中位数、标准差、方差、极差、四分位数…

    Pandas 2023年3月4日
    00
合作推广
合作推广
分享本页
返回顶部