Node.js 中使用流式处理进行文件压缩与解压

作者:墨池

时间:2026-10-31

浏览:159

本文详解如何在 Node.js 中利用 fs 模块的流式接口处理大文件,避免内存溢出。通过 createReadStream 和 createWriteStream 配合 pipe 方法实现数据分块传输,并结合原生 zlib 模块的 createGzip 和 createGunzip 接口,演示了文件压缩与解压的具体代码实现及原理。

文章目录

流式读写文件

首先需要明确压缩和解压文件的必要性。当文件体积过大时,直接将其加载到内存中可能导致系统资源耗尽,因此必须对文件进行压缩处理。

压缩后的文件在后续使用中需要被解压缩。考虑到极端情况下文件体积巨大,计算机内存可能无法一次性完整读取并存储整个文件,因此必须采用流式(Stream)技术来分块处理文件数据。

接下来,我们将具体了解如何对流式处理文件进行操作。

知识预知

在 Node.js 的 fs 模块中,提供了与 Stream 相关的基础接口:

  • createReadStream 用于创建文件的读取流,
  • createWriteStream 用于创建文件的写入流,

pipe 方法可以在两个流之间建立管道连接,将源流中的数据分块传输到目标流中。

例子

以下示例代码可供复制运行以验证结果。请确保代码中指定的源文件路径真实存在,例如在相同目录下创建一个包含任意内容的 a.txt 文件。运行代码后,同目录下将生成一个 b.txt 文件,其内容即为通过文件流和管道机制从 a.txt 复制过来的数据。

let fs = require('fs');
let readerStream = fs.createReadStream('a.txt');
let writerStream = fs.createWriteStream('b.txt');
readerStream.pipe(writerStream);

各位读者可复制此代码运行验证,前提需确保文件流中的路径真实存在(如同级目录下的a.txt),运行后会在同级目录生成b.txt,其内容通过文件流和管道方法从a.txt复制而来。

该示例代码创建了两个文件流实例:一个用于读取,另一个用于写入。通过调用 pipe 方法将这两个流连接起来,数据从读取流传输至写入流。这种传输方式的优势在于内存占用极低,因为每次仅在内存中处理一小部分数据块,而非整个文件。

压缩解压文件

知识预知

Node.js 内置了 zlib 模块库,专门用于处理文件的压缩与解压操作。

  • createGzip 方法用于执行文件压缩,
  • createGunzip 方法用于执行文件解压。

压缩文件

fs.createReadStream('a.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));

逐行分析这段三行代码:第一行创建读取流,读取 a.txt 文件内容;第二行调用 zlib.createGzip() 对数据进行压缩处理;第三行通过 fs.createWriteStream('input.txt.gz') 将压缩后的数据写入到 input.txt.gz 文件中。

这三个部分通过 pipe 方法串联起来,意味着处理过程并非针对完整文件一次性加载,而是以流式方式分块处理文件数据。

解压文件

fs.createReadStream('input.txt.gz')
  .pipe(zlib.createGunzip())
  .pipe(fs.createWriteStream('c.txt'));

基于前文对压缩文件的讲解,相信读者能够理解解压文件各部分的逻辑。建议读者结合代码自行思考并验证解压过程。

总结

以上为个人经验分享,希望能为大家提供参考,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章