10

我分两步使用 nodejs 写入文件:

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

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

但是现在我注意到有更多的函数用于写入文件,比如fs.openor fs.close,我应该在写入时使用这些函数来打开还是关闭文件?

此外,我注意到有 havefs.createReadStream和function ,它们和和有fs.createWriteStream什么区别?fs.writeFilefs.readFile

4

1 回答 1

31

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

低级:

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

请注意,所有这些都是异步的,并且也有同步版本:fs.openSyncfs.closeSyncfs.readSyncfs.writeSync,您不会使用回调。异步版本和同步版本之间的区别在于,fs.openSync只有在打开文件的操作完成时才会返回,而fs.open会立即返回并且您将在回调中使用文件描述符。

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

中级:

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

高水平:

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

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

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

于 2012-08-14T09:11:54.123 回答