Node.js数据流Stream之Readable流和Writable流用法

Node.js数据流Stream之Readable流和Writable流用法

引言

在Node.js中,数据流(Stream)是一种处理数据的抽象接口,可以将数据读入或写出到内存,文件或网络等多种数据源和目标。Stream接口的主要好处是可以分块处理大量的数据,避免一次性将整个数据读入或写出而导致的内存占用和性能问题。其中Readable流和Writable流是Stream接口中最基础且常用的两种流类型。本文将详细讲解这两种流的用法,帮助读者理解Node.js数据流的核心概念和使用技巧。

Readable流

创建Readable流

创建Readable流的最简单方式是使用fs.createReadStream()方法,该方法可以让我们从文件中读取数据并创建一个可读流对象。下面是一个例子,读取当前目录下的test.txt文件并输出其内容:

const fs = require('fs');
const readStream = fs.createReadStream('./test.txt');
readStream.on('data', (chunk) => console.log(chunk.toString()));

在上面的例子中,我们使用了createReadStream()方法创建了一个可读流对象readStream,每次读取一块数据时会触发'data'事件,我们可以通过监听该事件来获取数据块的内容,并调用toString()转换为字符串后输出到控制台。这里的chunk参数代表读取到的数据块。

暂停和恢复Readable流

默认情况下,Readable流以最大速度不断地推送数据,因此可能会导致内存占用过高或数据丢失的问题。我们可以使用暂停和恢复方法来控制流的速度和状态。

暂停流

我们可以使用pause()方法暂停流的读取操作,这样就可以停止流的任何数据输出操作。当我们需要停止数据推送时,需要调用流的pause()方法,代码如下:

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

在上面的例子中,我们在读取完一个数据块后调用了pause()方法,这将阻止Readble流继续从底层资源读取数据。

恢复流

我们可以使用resume()方法来恢复读取流,从而继续生成数据推送。当我们需要恢复数据输出时,需要调用流的resume()方法,代码如下:

readStream.on('data', (chunk) => {
  console.log(chunk.toString());
  readStream.pause();
  setTimeout(() => {
    readStream.resume();
  }, 1000);
});

在上面的例子中,我们在读取完一个数据块后不仅调用了pause()方法暂停流的读取操作,还延迟了1秒钟后再次调用了resume()方法,这将允许更多的数据推送进来。

绑定end事件

当读取完所有数据时,Readable流会触发end事件,我们可以在回调函数中执行一些清理操作或者输出流结束的提示信息等。示例如下:

readStream.on('end', () => {
  console.log('文件读取完毕!');
});

链式创建流

Readable流支持链式创建流,这样可以让我们将多个流连接起来依次处理数据。例如,在上面读取文件的例子中,我们可以将读取流和输出流连接起来,将读取到的数据写入到另一个文件:

const fs = require('fs');
const readStream = fs.createReadStream('./test.txt');
const writeStream = fs.createWriteStream('./output.txt');
readStream.pipe(writeStream);

在上面的代码中,我们使用了pipe()方法将读取流readStream连接到写入流writeStream,其中数据将从readStream流中读取,经过一系列处理后写入writeStream流中。

Writable流

创建Writable流

Writable流用于将数据写入到指定的数据源,例如文件、HTTP请求体和TCP套接字等。我们可以使用createWriteStream()方法创建Writable流对象,并向其中写入数据。下面是一个例子,将一个字符串写入到文件output.txt中:

const fs = require('fs');
const writeStream = fs.createWriteStream('./output.txt');
writeStream.write('Hello World!');

在上面的例子中,我们使用createWriteStream()方法创建了一个可写流对象writeStream,然后使用write()方法写入了一个字符串'Hello World!'到文件中。

模拟HTTP POST请求

我们可以使用Writable流来模拟HTTP POST请求,向服务器发送表单数据或者JSON数据等。下面是一个例子,使用http模块向网站发送POST请求:

const http = require('http');
const options = {
  hostname: 'www.example.com',
  path: '/foo',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
};
const request = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
});
request.on('error', (error) => {
  console.error(error);
});
request.write('data1=value1&data2=value2');
request.end();

在上面的例子中,我们创建了一个http.request对象,并传入服务器地址、端口、请求方法和请求头等信息。然后使用该对象的write()方法向服务器发送表单数据,最后使用end()方法结束请求并向服务器发送数据。

链式创建流

Writable流也支持链式创建流,例如将一个文件读取流和一个网络请求连接起来,将读取到的内容发送到指定的HTTP服务器:

const fs = require('fs');
const http = require('http');
const options = {
  hostname: 'www.example.com',
  path: '/foo',
  method: 'POST',
  headers: {
    'Content-Type': 'application/octet-stream'
  }
};
const readStream = fs.createReadStream('./test.txt');
const request = http.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);
});
readStream.pipe(request);

在上面的代码中,我们使用fs.createReadStream()方法将文件读取为一个可读流对象readStream,使用http.request()方法创建一个http请求对象request,并将readStream和request对象通过pipe()方法进行连接。

结论

Readable流和Writable流是Node.js中数据流Stream接口的最基础和最常用的两种流类型。Readable流用于从数据源(如文件、网络、或者内存等)中将数据分块读取到内存中进行处理,而Writable流用于将处理完成的数据分块写入到目标数据源中(如文件、网络、或者内存等)。了解这两种流的基本操作和使用技巧是每个Node.js开发者必备的技能,能够帮助我们更好地处理和管理各种数据源和目标,提高Node.js应用程序的性能和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node.js数据流Stream之Readable流和Writable流用法 - Python技术站

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

相关文章

  • 原生JS实现移动端web轮播图详解(结合Tween算法造轮子)

    下面是 “原生JS实现移动端web轮播图详解(结合Tween算法造轮子)” 的完整攻略: 概述 移动端web轮播图十分常见,本文将利用原生JavaScript实现一款移动端web轮播图,并采用Tween算法实现动画效果。 实现步骤 步骤一:HTML结构 首先,我们需要在HTML中创建一个轮播图的容器,并在其中添加若干个图片元素,如下所示: <div c…

    node js 2023年6月8日
    00
  • Angular+Node生成随机数的方法

    生成随机数是我们在开发中经常需要的操作。在Angular和Node.js开发中,也需要生成随机数。本文将会详细讲解如何使用Angular和Node.js来生成随机数。 生成随机数的方法 在Angular应用中生成随机数 在Angular应用中,可以使用JavaScript的Math库来生成随机数。具体方法如下: let randomNumber = Math…

    node js 2023年6月8日
    00
  • 在JS循环中使用async/await的方法

    当在JavaScript中使用循环时,通常我们会面临一个问题,即如何同时异步执行循环体中的多个异步操作,并在它们都完成后执行下一步操作。对于这种情况,我们可以使用async/await结合并发循环来解决这个问题。 使用Promise.all结合循环并发执行异步操作 一种常见的使用async/await结合并发循环的方法是使用Promise.all。假设我们有…

    node js 2023年6月8日
    00
  • nodejs实现一个word文档解析器思路详解

    下面是“nodejs实现一个word文档解析器思路详解”的完整攻略: 1. 了解Word文档格式 要实现一个Word文档解析器,首先要了解Word文档的格式。Word使用的是二进制文件格式(.doc),这种格式非常复杂,需要逐个字节地解析文件内容。我们可以使用第三方库docx来进行解析,这个库会将Word文档转为XML格式,方便我们进行解析。 2. 安装No…

    node js 2023年6月8日
    00
  • Nest.js系列学习控制器使用示例详解

    首先,感谢您对本网站“Nest.js系列学习控制器使用示例详解”攻略的关注。以下是本攻略的完整内容。 一、 概述 本攻略主要介绍了Nest.js控制器的使用。由于控制器是Nest.js应用程序中的核心部分,因此了解控制器和掌握其使用方法非常重要。 什么是Nest.js的控制器? Nest.js的控制器是处理网络请求的核心组件。控制器处理传入的请求并在向客户端…

    node js 2023年6月8日
    00
  • NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法

    下面是详细讲解NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法的攻略。 简要说明 在传统的文件上传方式中,通常会通过<input type=”file”>来进行上传,但是用户需要点击选择文件上传的按钮,比较麻烦。而使用拖拽文件上传则可以更加方便,用户只需要把需要上传的文件拖拽到指定的区域即可。结合HTML5和NodeJS的技术…

    node js 2023年6月8日
    00
  • node.js实现快速截图

    Node.js实现快速截图的攻略可以分为以下几个步骤: 1. 安装依赖 使用Node.js实现截图需要用到puppeteer这个库,它是一个Chrome Headless浏览器的Node.js API。因此,我们需要先安装Node.js和puppeteer库。 # 安装Node.js,建议使用版本号为10及以上的LTS版本 # Mac用户可使用Homebre…

    node js 2023年6月8日
    00
  • nodejs实现范围请求的实现代码

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它可以在服务器端运行JavaScript,实现了事件驱动、非阻塞I/O模型。 实现范围请求是指客户端请求服务器上的某个资源时,服务器返回部分资源内容而不是全部内容。这种请求方式可以优化网络传输,因为它仅仅请求资源的一部分,例如在视频播放时可以只请求当前播放时间点以后的视频数据。 N…

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