file - 对 node.js 文件系统感到困惑

标签 file node.js

我分两步使用nodejs写文件:

1.首先判断文件是否存在,使用fs.exists函数;

2.然后使用fs.writeFile直接写入文件;

但现在我注意到有更多用于写入文件的函数,如 fs.openfs.close,我应该在打开或关闭文件时使用这些函数吗?写作?

此外,我注意到有 fs.createReadStreamfs.createWriteStream 函数,它们与 fs.writeFilefs.readFile?

最佳答案

以下是我将如何解释差异:

低级:

fs.openfs.close处理文件描述符。这些是低级函数,表示对 open(2) 的映射调用。 BSD 系统调用。由于您将拥有一个文件描述符,因此您可以将它们与 fs.read 一起使用。或 fs.write .

注意,所有这些都是异步的,也有同步版本:fs.openSync , fs.closeSync , fs.readSync , fs.writeSync , 你不会使用回调。异步和同步版本之间的区别在于 fs.openSync 只会在打开文件的操作完成后返回,而 fs.open 会立即返回并且你' d 在回调中使用文件描述符。

这些低级函数可让您完全控制,但意味着更多的编码。

中级:

fs.createReadStreamfs.createWriteStream创建可以连接到事件的流对象。这些事件的示例是“数据”(当读取了一 block 数据,但该 block 只是文件的一部分)或“关闭”。这样做的好处是您可以读取文件并在数据进入时对其进行处理,即您不必读取整个文件,将其保存在内存中然后处理它。这在处理大文件时很有意义,因为您可以在处理 block 中的位而不是处理整个文件(例如内存中的整个 1GB 文件)时获得更好的性能。

高级别的:

fs.readFilefs.writeFile对整个文件进行操作。所以你会调用 fs.readFile, Node 会读入整个文件,然后在你的回调中显示整个数据。这样做的好处是您不需要处理不同大小的 block (例如使用流时)。写入时, Node 将写入整个文件。这种方法的缺点是在读/写时,您必须将整个文件保存在内存中。例如,如果您正在转换一个日志文件,您可能只需要几行数据,使用流您可以做到这一点,而无需等待文件完全读入后再开始写入。

还有,fs.readFileSyncfs.writeFileSync它不会使用回调,而是在返回之前等待读/写完成。使用它的好处是,对于小文件,您可能不想在文件返回之前执行任何操作,但对于大文件,这意味着 CPU 在等待文件 I/O 完成时会空闲。

希望这是有道理的,并且在回答您的问题时,使用 fs.writeFile 您不需要 fs.openfs.close.

关于file - 对 node.js 文件系统感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948290/

相关文章:

node.js - 从 Node 模块获取类似 sytax 的 jquery

Java 将 Jar URL 转换为文件

c - 在 C 中寻找文件位置 > 2^32

node.js - 如果 wolkenkit(或任何)事件源事件是非结构化的,会有问题吗?

node.js - 适用于 Node.js 的 AWS S3 SDK V3 - GetObjectCommand v/s getSignedUrl

javascript - 从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

javascript - Mongodb $pull 执行以从嵌套子数组中删除 ObjectId ("... id")。

javascript - 如何在不通过服务器传递文件的情况下将文件上传到 amazon S3?

java - 需要帮助读取 <> 之间的单词并保存到数组

java - 将源的子文件复制到 Java 中的目标