困惑于node.js文件系统

10

我曾使用nodejs的两个步骤编写文件:

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

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

但是现在我注意到有更多的函数用于编写文件,比如fs.openfs.close,我应该在编写时使用这些吗?

此外,我注意到有fs.createReadStreamfs.createWriteStream函数,它们与fs.writeFilefs.readFile之间有什么区别?

1个回答

31

下面是我对这些差异的解释:

低级别(Low-level):

fs.openfs.close 操作文件描述符。这些是低级别函数,代表调用open(2) BSD系统调用。由于您将拥有一个文件描述符,因此您将使用这些函数与fs.readfs.write一起使用。

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

这些低级别函数可以给您完全控制,但需要编写更多的代码。

中等级别(Mid level):

fs.createReadStreamfs.createWriteStream 创建流对象,你可以将其链接到事件上。这些事件的示例是'data'(当数据块读取完成时,但该块仅是文件的一部分)或'close'。其中的优点是,你可以在读取文件时处理数据,即不必读取整个文件,将其保存在内存中,然后再处理它。这在处理大文件时是有意义的,因为通过按块处理比处理整个文件(如内存中的整个 1GB 文件)可以获得更好的性能。

高级:

fs.readFilefs.writeFile 操作整个文件。所以你会调用fs.readFile,Node会读取整个文件,然后在回调函数中呈现出整个数据。这种方法的优点是你不需要处理不同大小的块(例如使用流时)。当写入时,Node会写入整个文件。这种方法的缺点是,在读/写时,你必须将整个文件保存在内存中。例如,如果你要转换日志文件,你可能只需要数据行,使用流可以在开始写入之前无需完全等待文件读取完成即可完成。

还有 fs.readFileSyncfs.writeFileSync 。他们不会使用回调函数,而是等待读取/写入完成后返回结果。使用这种方法的好处在于对于小文件,您可能不需要在文件返回之前执行任何操作,但对于大文件来说,这将意味着CPU在等待文件I/O完成时会空闲下来。

希望这样讲清楚了。针对你的问题,当使用 fs.writeFile 时,您不需要使用 fs.openfs.close


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接