Node.js 中如何使用 Buffer 与 Stream 实现文件操作

阅读时长 6 分钟读完

Node.js 是一个基于 Chrome V8 引擎的轻量级 JavaScript 运行时环境,适用于高并发、数据密集型、实时的 Web 应用程序。在 Node.js 中,Buffer 和 Stream 是常用的模块,可用于文件操作。本文将介绍如何使用 Buffer 和 Stream 在 Node.js 中进行文件的读写操作。

Buffer

在 Node.js 中,Buffer 是一个全局对象,用于处理二进制数据。Buffer 可以将字符串、数组或者其他可迭代对象转化为二进制数据,也可以将二进制数据转化为字符串或 JSON 数据。Buffer 可以用于网络数据传输、加密解密、图片处理等操作。

创建 Buffer 对象

在 Node.js 中,可以通过以下方式创建 Buffer 对象:

-- -------------------- ---- -------
-- ----- ----------- - - ------ --
----- ---- - -----------------

-- ----- ----------- - - ------ --
----- ---- - ---------------- ---

-- ----- -------- ------ --
----- ---- - -----------------------

-- ---- ----- ------- ------ --
----- ---- - ------------------ --------

-- --------- ------ --
----- ---- - --------------- -- -- -- ----

读写文件

在 Node.js 中,可以使用 fs 模块来读取和写入文件。通过 Buffer 和 fs 模块的结合使用,可以实现二进制文件的读取和写入。

下面是一个简单的示例,从文件中读取二进制数据,并将其保存到 Buffer 对象中:

-- -------------------- ---- -------
----- -- - --------------

------------------------ ----- ----- -- -
  -- ----- -
    -------------------
    -------
  -
  ----- --- - ------------------
  ------------------- ------------
  ------------------- --------------------------------
---

在上面的示例代码中,通过 fs.readFile 方法读取了 input.txt 文件中的内容,并将其保存到 Buffer 对象中。console.log 方法将所保存的 Buffer 对象输出到控制台,并将其转换为 UTF-8 字符串。

下面是一个将 Buffer 对象写入文件的示例代码:

-- -------------------- ---- -------
----- -- - --------------

----- --- - ------------------ --------
-------------------------- ---- ----- -- -
  -- ----- -
    -------------------
    -------
  -
  ----------------------
---

在上面的示例代码中,通过 fs.writeFile 方法将 Buffer 中的数据写入到 output.txt 文件中。

Stream

在 Node.js 中,Stream 是一种处理流式数据的抽象接口。Stream 可以用于处理网络数据传输、文件读写、加密解密等操作。Stream 分为可读流、可写流和双工流。

可读流

在 Node.js 中,可以通过 fs.createReadStream 方法创建一个可读流,用于读取文件中的数据。

下面是一个简单的示例代码:

-- -------------------- ---- -------
----- -- - --------------

----- -- - -------------------------------- - -------------- -- ---
------------- ------- -- -
  --------------- --------------- ----------------
---
------------ -- -- -
  ------------------------
---

在上面的示例代码中,通过 fs.createReadStream 方法创建了一个可读流对象 rs。highWaterMark 参数指定了每次读取的最大字节数。当数据可读时,会触发 'data' 事件,当数据读取完毕时,会触发 'end' 事件。

可写流

在 Node.js 中,可以通过 fs.createWriteStream 方法创建一个可写流,用于将数据写入文件中。

下面是一个简单的示例代码:

-- -------------------- ---- -------
----- -- - --------------

----- -- - -----------------------------------
--- ---- - - -- - - ------ ---- -
  --------------- ----------
-
---------
--------------- -- -- -
  ------------------------
---

在上面的示例代码中,通过 fs.createWriteStream 方法创建了一个可写流对象 ws。使用 write 方法写入数据,使用 end 方法结束写入操作。当所有数据写入完成时,会触发 'finish' 事件。

双工流

在 Node.js 中,可以通过 stream.Duplex 类创建一个双工流对象,双工流同时支持读取和写入操作。

下面是一个简单的示例代码:

-- -------------------- ---- -------
----- ------ - ------------------

----- -------- ------- ------------- -
  ------------- -
    --------
    ---------- - --
  -

  ----------- -
    ---------------- ----------------------
    -- ----------- - --- -
      ----------------
    -
  -

  ------------- --------- --------- -
    --------------- --------------- ---------------
    -----------
  -
-

----- ------ - --- -----------
----------------- ------- -- -
  --------------- --------------- ---------------
---
--------------------- -- -- -
  ----------------------
---

在上面的示例代码中,通过继承 stream.Duplex 类创建了一个 MyDuplex 类。当可读流被读取时,将发送数据,并在每次读取最多 10 次数据后自动停止。当可写流被写入时,将输出已写入的数据。使用 duplex.write 方法写入数据,当数据写入完成时,会触发回调函数。

总结

通过上面的实例代码,我们可以看出在 Node.js 中使用 Buffer 和 Stream 实现文件操作非常简单。Buffer 可以将字符串、数组或者其他可迭代对象转化为二进制数据,也可以将二进制数据转化为字符串或 JSON 数据。Stream 分为可读流、可写流和双工流,可用于处理网络数据传输、文件读写、加密解密等操作。其中可读流和可写流是单向流,而双工流是两个方向都可以的流。

在实际的应用中,我们可以根据实际的需求来选择适合的模块进行文件操作。同时,在进行文件读写操作时,也需要注意文件的扩展名、编码格式等一些细节问题,保证读写的正确性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c9a9e85ad90b6d0417b94e

纠错
反馈