node 可读流与可写流的运用详解

yizhihongxing

Node 可读流与可写流的运用详解

概述

在 Node.js 中,读写操作一般来说都会使用流的方式进行。其中可读流提供了一种将数据从 source 输出到 destination 的抽象方式;而可写流则提供了一种将数据写入 destination 的抽象方式。对于数据中间处理过程,我们可以使用管道(piping)的方式链接可读流和可写流。

可读流

核心方法

Node.js 中可读流分为多种类型,如 fs.createReadStreamhttp.IncomingMessage 等。这些不同类型的可读流都有一些相同的方法:

  • read(): 从可读流中读取数据,该方法会返回可读流缓存区中的数据,如果缓存区为空,则返回 null。
  • on('data', callback): 当从可读流中读取到数据时,会触发 data 事件,这个回调函数会被调用,回调函数的第一个参数就是读取到的数据。
  • on('end', callback): 当可读流中的数据被读取完毕时,会触发 end 事件,回调函数会被调用。

示例1:从文件中读取数据

下面是一个从文件中读取数据的例子:

const fs = require('fs');
const rs = fs.createReadStream('input.txt');

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

rs.on('end', () => {
  console.log('File reading is finished.');
});

上述代码中,我们使用 createReadStream 方法创建了一个可读流,并指定要读取的源文件是 input.txt。之后,我们监听了可读流的 data 事件和 end 事件。当有数据可读时,会将数据按照 chunk 的方式传递给data 事件的回调函数,并输出收到的数据长度。当可读流中的数据读取完毕时,会触发 end 事件,回调函数会被调用并输出提示。

可写流

核心方法

Node.js 中可写流分为多种类型,如 fs.createWriteStreamhttp.ServerResponse 等。这些不同类型的可写流都有一些相同的方法:

  • write(chunk, [callback]): 将数据写入可写流中。
  • end([chunk], [encoding], [callback]): 停止写入数据,当参数被指定时,会先调用 write 方法写入数据,之后触发 finish 事件。

示例2:将数据写入文件

下面是一个将数据写入文件的例子:

const fs = require('fs');
const ws = fs.createWriteStream('output.txt');

ws.write('Hello, ');
ws.write('world!');
ws.end();

ws.on('finish', () => {
  console.log('File writing is finished.');
});

上述代码中,我们使用 createWriteStream 方法创建了一个可写流,并指定要写入的目标文件是 output.txt。之后,我们先使用 write 方法将数据写入缓存区中,然后通过 end 方法停止写入数据,并触发 finish 事件。在该事件的回调函数中,我们输出了文件写入完成的提示信息。

管道

管道是一种将可读流和可写流链接起来的方式,使得数据可以直接从可读流中流向可写流中,而不需要在中间创建额外的缓存区。

示例3:将文件中的数据写入另一个文件

下面是一个将文件中的数据写入另一个文件的例子:

const fs = require('fs');
const rs = fs.createReadStream('input.txt');
const ws = fs.createWriteStream('output.txt');

rs.pipe(ws);

ws.on('finish', () => {
  console.log('Data has been piped.');
});

上述代码中,我们使用 createReadStream 方法创建了一个可读流,并指定要读取的源文件是 input.txt,使用 createWriteStream 方法创建了一个可写流,并指定要写入的目标文件是 output.txt。之后,我们使用 pipe 方法将可读流和可写流链接起来,直接将数据从 input.txt 中读取出来,以 chunk 的方式传递到 output.txt 中,这个过程中不需要借助额外的缓存区。在数据被写入 output.txt 文件之后,会触发 finish 事件,并输出提示信息。

总结

通过本文,我们学习了 Node 可读流和可写流的基本知识,包括了可读流的核心方法和示例,可写流的核心方法和示例,以及如何使用管道将两个流链接起来。对于低内存消耗和高效处理大文件来说,应用流实现数据处理是一种非常有效的方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node 可读流与可写流的运用详解 - Python技术站

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

相关文章

  • json跨域调用python的方法详解

    前言 在Web开发中,我们经常需要进行跨域调用,其中就有一种情况是JavaScript通过Ajax向Python服务器发送Json格式请求,接收服务器返回的Json格式数据。本文将详细介绍一种基于Flask框架的Python跨域调用处理方法。 步骤一:从Flask导入必要的库 我们首先要导入必要的库。在本例中,我们使用Flask库作为Python的Web框架…

    node js 2023年6月8日
    00
  • JavaScript 关于事件循环机制的刨析

    JavaScript 关于事件循环机制的刨析 什么是事件循环机制 JavaScript 引擎采用的是单线程执行模式,只有一个调用堆栈,每一次执行上下文都会从调用堆栈依次出栈,为了解决程序中出现的异步执行问题,JavaScript 引入了事件循环机制。 事件循环机制是指,当 JavaScript 引擎执行完调用堆栈中所有任务后,会去检查任务队列中是否还有任务未…

    node js 2023年6月8日
    00
  • Node.js如何提取文件中的中文字符

    下面是详细讲解“Node.js如何提取文件中的中文字符”的完整攻略。 概述 在Node.js中提取文件中的中文字符有多种方法,最常用的是通过正则表达式匹配。Node.js中的正则表达式与JavaScript中的正则表达式基本相同。 步骤 以下是提取文件中的中文字符的步骤: 首先,需要使用Node.js的内置模块fs来读取文件。使用fs模块中的readFile…

    node js 2023年6月8日
    00
  • 深入理解Angularjs 脏值检测

    接下来我将为您详细讲解“深入理解Angularjs 脏值检测”的完整攻略。 什么是脏值检测 在AngularJS中,所有的模型数据都被存储在$scope对象中,而这些数据的变化是由用户的操作或者系统自身的操作引起的。为了使模型数据和视图保持同步,AngularJS框架使用了脏值检测机制。 所谓脏值检测,就是通过比较当前值和上一次的值是否发生改变来检测模型变化…

    node js 2023年6月8日
    00
  • node.js域名解析实现方法详解

    Node.js域名解析实现方法详解 什么是域名解析 域名解析是将域名解析成IP地址的过程,它是Internet世界中最基本的服务之一。在网络互联世界中,我们经常使用域名来访问网站,但是计算机语言只能认识IP地址,因此我们需要用域名解析成IP地址才能访问网站。 Node.js域名解析 在Node.js中,我们可以使用内置的dns模块来实现域名解析功能。该模块提…

    node js 2023年6月8日
    00
  • npm script和package-lock.json使用示例详解

    我来为您详细讲解 “npm script和package-lock.json使用示例详解”。 什么是npm script和package-lock.json? 在正式讲解之前,先简单介绍一下npm script和package-lock.json。 npm script npm script是在package.json文件中定义的一组脚本命令。npm scr…

    node js 2023年6月8日
    00
  • mongoose中利用populate处理嵌套的方法

    当使用具有嵌套字段的mongoose模型时,可能需要将嵌套字段中的引用字段填充(filling)。 Mongoose中的populate函数使我们能够轻松地处理这种情况,使得查询结果中包含嵌套引用字段的详细信息。 下面我们将详细介绍如何使用populate函数处理嵌套字段。步骤如下: 1. 创建模型 首先,我们创建两个模型Parent和Child: cons…

    node js 2023年6月8日
    00
  • Node.js使用多进程提高任务执行效率

    当需要运行一些涉及CPU密集型的任务时,例如文件处理和数据分析,使用多线程或多进程可以大大提高程序的执行效率。Node.js的Child Process模块可以帮助我们使用多进程来执行耗时的任务。 下面是使用Node.js多进程的攻略: 准备工作 在开始使用Node.js的Child Process模块之前,你需要先了解以下几个概念: 进程(Process)…

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