【Node.js】流

概念

流(Stream)是一种用于在节点(Node)之间传输数据的抽象概念。

它可以看作是一种连续的数据流,数据可以按照连续的块(chunk)通过流从源(source)流向目的地(destination)。流可以是可读的(Readable)或可写的(Writable),也可以是可读写的(Duplex)。

Node.js 提供了 stream 模块,它包含了用于创建、处理和管理流的各种类和方法。

当然,在浏览器端,HTML5 提供了一些原生的流处理能力,如 ReadableStream 和 WritableStream。这些浏览器 API 允许通过网络请求获取数据的流式传输,而不是一次性获取整个响应。另外,浏览器端还可以使用 Blob 对象来处理文件流。

  1. 可读流(Readable Stream):可读流用于从数据源中读取数据。例如,可以使用可读流从文件系统中读取文件、从网络中接收数据、从标准输入读取用户输入等。可读流的常见用法包括使用 fs.createReadStream() 创建文件读取流、使用 http.IncomingMessage 对象获取 HTTP 请求的可读流。

  2. 可写流(Writable Stream):可写流用于将数据写入目的地。例如,可以使用可写流将数据写入文件、将数据发送到网络、将数据输出到标准输出等。可写流的常见用法包括使用 fs.createWriteStream() 创建文件写入流、使用 http.ServerResponse 对象发送 HTTP 响应的可写流。

  3. 双工流(Duplex Stream):双工流实现了同时可读可写的功能。它可以同时处理输入和输出流。例如,可以使用双工流处理网络通信中的数据读取和写入。

  4. 转换流(Transform Stream):转换流是一种特殊的双工流,它可以对流中的数据进行转换。例如,可以使用转换流进行数据压缩、加密、解密、格式转换等操作。常见的转换流包括 zlib.createGzip() 创建用于数据压缩的流、crypto.createCipher() 创建用于数据加密的流等。

具体用法

  1. 数据转换:流可以用于在数据传输的过程中进行转换操作。通过使用转换流(Transform Stream),我们可以对流中的数据进行处理、转换和过滤。常见的转换操作包括数据压缩(使用 zlib.createGzip() 创建压缩流)、数据加密(使用 crypto.createCipher() 创建加密流)等。

例如,以下示例将一个文本文件压缩并保存成新的文件:

const fs = require('fs');
const zlib = require('zlib');

const readableStream = fs.createReadStream('input.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('output.txt.gz');

readableStream.pipe(gzipStream).pipe(writableStream);

在这个示例中,通过将可读流连接到压缩流,然后再连接到可写流,实现了从输入文件到输出压缩文件的流转换。

  1. 大文件处理:使用流可以有效地处理大文件,而不需要将整个文件加载到内存中。通过将文件读取流连接到文件写入流,可以逐块地将大文件从源复制到目标地。

例如,以下示例将一个大文件复制到新的文件:

const fs = require('fs');

const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');

readableStream.pipe(writableStream);

这段代码使用可读流从 input.txt 文件中读取数据,并使用可写流将数据写入 output.txt 文件中。通过使用流,大文件可以逐块地处理,减少了内存占用。

  1. 网络通信:流在网络通信中也经常被使用。在服务器端,可以使用可读流读取请求数据,同时通过可写流向客户端发送响应数据。在客户端,同样可以使用可读流读取服务器响应数据,通过可写流将请求数据发送到服务器。

例如,以下示例使用 Node.js 的 http 模块创建一个简单的 Web 服务器,并将接收到的请求数据作为响应返回给客户端:

const http = require('http');

const server = http.createServer((req, res) => {
  req.setEncoding('utf-8');
  req.on('data', (chunk) => {
    console.log(`Received data: ${chunk}`);
  });

  res.write('Hello, World!');
  res.end();
});

server.listen(8080, () => {
  console.log('Server is listening on port 8080');
});

在这个示例中,当客户端发送请求时,服务器会将请求的数据作为流式数据接收。在 data 事件处理程序中,我们可以对接收到的数据进行处理。同时,服务器使用 write() 方法将响应数据写入可写流,最后使用 end() 方法结束响应。

相关推荐

  1. <span style='color:red;'>nodejs</span><span style='color:red;'>流</span>

    nodejs

    2024-03-25 20:32:05      56 阅读
  2. Node.js】

    2024-03-25 20:32:05       43 阅读
  3. node服务器——处理原始的请求

    2024-03-25 20:32:05       35 阅读
  4. <span style='color:red;'>nodejs</span>

    nodejs

    2024-03-25 20:32:05      40 阅读
  5. <span style='color:red;'>nodejs</span>

    nodejs

    2024-03-25 20:32:05      36 阅读
  6. IO——其他

    2024-03-25 20:32:05       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 20:32:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 20:32:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 20:32:05       82 阅读
  4. Python语言-面向对象

    2024-03-25 20:32:05       91 阅读

热门阅读

  1. 【如何解决Go包中循环依赖】

    2024-03-25 20:32:05       40 阅读
  2. Android基础面试题目汇总

    2024-03-25 20:32:05       34 阅读
  3. 2019南京大学计算机考研复试机试题-Stepping Numbers

    2024-03-25 20:32:05       42 阅读
  4. Nginx配置文件中Location指令的匹配优先级

    2024-03-25 20:32:05       32 阅读
  5. 【微服务设计】常见的DDD设计中的经验教训!

    2024-03-25 20:32:05       40 阅读
  6. 计算机网络原理之四种攻击

    2024-03-25 20:32:05       42 阅读
  7. Android中的设计模式

    2024-03-25 20:32:05       37 阅读
  8. 异常的处理(try-catch-finally)

    2024-03-25 20:32:05       38 阅读
  9. C语言空指针常量NULL

    2024-03-25 20:32:05       35 阅读
  10. python内置函数 T

    2024-03-25 20:32:05       42 阅读
  11. 约瑟夫问题---(蓝桥杯)

    2024-03-25 20:32:05       41 阅读