我在两个步骤中使用了带有nodejs的写文件:
1.首先判断文件是否存在,使用fs.exists
函数;
2.然后使用fs.writeFile
直接写文件;
但是现在我注意到有更多的函数用于写文件,比如fs.open
或fs.close
,我应该在编写时使用这些函数来打开还是关闭文件?
此外,我注意到有fs.createReadStream
和fs.createWriteStream
函数,它们与fs.writeFile
和fs.readFile
之间的区别是什么?
答案 0 :(得分:29)
以下是我将如何解释这些差异:
<强>低电平:强>
fs.open和fs.close处理文件描述符。这些是低级函数,表示对open(2) BSD系统调用的映射调用。由于您将拥有文件描述符,因此您可以将其与fs.read或fs.write一起使用。
请注意,所有这些都是异步的,并且还有同步版本:fs.openSync,fs.closeSync,fs.readSync,fs.writeSync,您不会使用回调。异步和同步版本之间的区别在于fs.openSync
仅在打开文件的操作完成时返回,而fs.open
会立即返回,并且您将在回调中使用文件描述符。 / p>
这些低级功能可以让您完全控制,但意味着更多编码。
中级:
fs.createReadStream和fs.createWriteStream创建可以连接到事件的流对象。这些事件的示例是“数据”(当读取了一大块数据,但该块只是文件的一部分时)或“关闭”。这样做的好处是,您可以读取文件并在数据进入时对其进行处理,即您不必读取整个文件,将其保存在内存中然后进行处理。这在处理大型文件时很有意义,因为您可以在处理块中的位时获得更好的性能,而不是处理整个文件(例如,内存中的整个1GB文件)。
高级别:
fs.readFile和fs.writeFile对整个文件进行操作。所以你打电话给fs.readFile
,节点将读入整个文件,然后在你的回调中显示整个数据。这样做的好处是您不需要处理不同大小的块(比如使用流时)。写入时,node会写入整个文件。这种方法的缺点是,在读/写时,您必须将整个文件放在内存中。例如,如果要转换日志文件,则可能只需要数据行,使用流可以执行此操作,而无需等待文件在开始写入之前完全读取。
还有fs.readFileSync和fs.writeFileSync不会使用回调,但在返回之前等待读/写完成。使用它的好处是,对于一个小文件,你可能不希望在文件返回之前做任何事情,但对于大文件,这意味着CPU在等待文件I / O完成时会空闲。
希望有意义并回答您的问题,在使用fs.writeFile
时,您不需要fs.open
或fs.close
。