我曾使用nodejs的两个步骤编写文件:
1.首先判断文件是否存在,使用fs.exists
函数;
2.然后直接使用fs.writeFile
来编写文件;
但是现在我注意到有更多的函数用于编写文件,比如fs.open
或fs.close
,我应该在编写时使用这些吗?
此外,我注意到有fs.createReadStream
和fs.createWriteStream
函数,它们与fs.writeFile
和fs.readFile
之间有什么区别?
下面是我对这些差异的解释:
低级别(Low-level):
fs.open 和 fs.close 操作文件描述符。这些是低级别函数,代表调用open(2) BSD系统调用。由于您将拥有一个文件描述符,因此您将使用这些函数与fs.read或fs.write一起使用。
请注意,所有这些都是异步的,并且也有同步版本:fs.openSync、fs.closeSync、fs.readSync、fs.writeSync,其中您不需要使用回调函数。异步和同步版本之间的区别在于:fs.openSync
只有在打开文件的操作完成后才返回,而fs.open
会立即返回,并在回调中使用文件描述符。
这些低级别函数可以给您完全控制,但需要编写更多的代码。
中等级别(Mid level):
fs.createReadStream 和 fs.createWriteStream 创建流对象,你可以将其链接到事件上。这些事件的示例是'data'(当数据块读取完成时,但该块仅是文件的一部分)或'close'。其中的优点是,你可以在读取文件时处理数据,即不必读取整个文件,将其保存在内存中,然后再处理它。这在处理大文件时是有意义的,因为通过按块处理比处理整个文件(如内存中的整个 1GB 文件)可以获得更好的性能。
高级:
fs.readFile 和 fs.writeFile 操作整个文件。所以你会调用fs.readFile
,Node会读取整个文件,然后在回调函数中呈现出整个数据。这种方法的优点是你不需要处理不同大小的块(例如使用流时)。当写入时,Node会写入整个文件。这种方法的缺点是,在读/写时,你必须将整个文件保存在内存中。例如,如果你要转换日志文件,你可能只需要数据行,使用流可以在开始写入之前无需完全等待文件读取完成即可完成。
还有 fs.readFileSync 和 fs.writeFileSync 。他们不会使用回调函数,而是等待读取/写入完成后返回结果。使用这种方法的好处在于对于小文件,您可能不需要在文件返回之前执行任何操作,但对于大文件来说,这将意味着CPU在等待文件I/O完成时会空闲下来。
希望这样讲清楚了。针对你的问题,当使用 fs.writeFile
时,您不需要使用 fs.open
或 fs.close
。