Node.js 中 readFile 和 createReadStream 的区别

2025 年 2 月 25 日 | 阅读 4 分钟

Node.js 提供了广泛的文件处理选项。然而,在选择 Node.js 中最常用的文件读取函数时,readFile 和 createReadStream 是绝佳的选择。尽管两者都可以用于在 Node.js 中读取文件,但 fs.readFilefs.createReadStream 有着不同的作用:前者将整个文件读取到内存中,而后者则分块读取文件。

Node.js 中有两个方法(ReadFile 和 createReadStream)用于从文件系统中读取文件。然而,它们的功能和用例各不相同。

在使用 Node.js 开发应用程序时,文件处理在处理各种任务方面起着至关重要的作用,例如配置文件、记录信息,甚至管理用户上传以进行处理。Node.js 的 fs 模块提供了大量的​​文件处理函数,其中有两个函数尤为突出:readFile 和 createReadStream。

什么是 readFile?

文件系统(fs)模块中的一个异步方法 readFile 会将文件的内容读取到内存中,然后通过回调函数返回文件内容。它对于小文件来说简单易用。但是,对于大文件来说,它可能不是最佳选择,因为它会将整个文件加载到内存中。这可能导致内存使用过量。

语法

它具有以下语法:

参数

  • 文件名:文件名包含要读取的文件的路径。
  • 编码:这里存储文件的编码。如果未指定选项,则返回原始缓冲区,默认值为 'utf8'。
  • 回调函数:在读取文件后调用此函数,该函数接受两个参数 err 和 data。如果发生错误,它会存储在 err 中;否则,文件内容会存储在 data 中。

返回值

它检索文件的内容。

特性

readFile 的几个特点如下:

  • 整个文件都在内存中:readFile 一次性读取整个文件内容并将其存储在内存中。
  • 回调或 Promise:该方法允许使用回调和 Promise 进行异步执行。
  • 简单 API:它为文件读取操作提供了一个简单的 API。

什么是 createReadStream?

fs 模块中的另一个函数是 createReadStream,它创建一个可读流来分段读取文件。对于较大的文件,它效率更高,因为整个文件是逐渐加载到内存中的。相反,它以更易于管理的数据块读取数据,这对于大文件或流式数据来说非常理想。

语法

它具有以下语法:

示例

让我们以一个例子来说明 Node.js 中的 fs.createReadStream() 方法。

输出

 
Received chunk: [first chunk of data, up to 32KB]
Received chunk: [second chunk of data, up to 32KB]
...
Received chunk: [final chunk of data, which may be less than 32KB]
Finished reading   

说明

使用 fs.createReadStream

  • fs.createReadStream 生成一个名为 example.txt 的可读流。
  • 当读取一个数据块时,会触发 data 事件,并将数据块打印到控制台。
  • 当整个文件被读取后,会发出 end 事件,表明读取已完成。
  • 如果在读取过程中发生错误,则会发出 error 事件并记录到控制台。

Node.js 中 readFile 和 createReadStream 的主要区别

Difference between readFile and createReadStream in Node.js

readFilecreateReadStream 在 Node.js 中有几个区别。一些主要区别如下:

特点fs.readFilefs.createReadStream
读取机制它立即将整个文件读取到内存中。它以流的形式分块读取文件。
使用类型较小的文件大小是可以接受的。支持大文件。
内存消耗因为它将整个文件加载到内存中,所以需要更多内存。通过分块处理文件数据,它使用的内存更少。
回调/事件文件数据完全加载后,将使用回调函数进行处理。使用事件监听器(data、end、error)处理流式数据。
性能由于内存占用过高,大文件可能会变慢且效率低下因为它以数据块的形式流式传输数据,所以对于大文件来说效率更高。
API 简洁性简单的 API 使读取文件变得更容易、更快捷。需要处理多个事件,这可能更复杂。
错误处理使用单个回调来处理错误。使用 error 事件来处理错误。
用例读取配置文件、小的 JSON 文件以及任何其他小的文本文件。流式传输视频文件、日志文件或其他大文件。
阻塞/非阻塞非阻塞,但可能消耗大量内存。非阻塞,并设计为分块处理数据。
数据类型它以缓冲区或字符串的形式返回整个文件内容。数据是流式的,通常以数据块的形式处理。
开始位置它总是从文件开头读取。可以从文件的任何位置开始读取。
文件大小限制系统内存有限。内存不是限制,因此可以容纳大文件。
背压处理没有内置的背压管理。通过暂停和重新启动流自动响应背压。

结论

总而言之,理解 readFile 和 createReadStream 之间的区别对于有效的 Node.js 文件处理至关重要。虽然 readFile 对于小文件来说易于使用,但 createReadStream 对于大文件来说更高效、更具可扩展性。通过根据我们的用例选择合适的方法,我们可以提高性能,有效管理内存使用,并确保我们的应用程序平稳运行。