困惑于node.js文件系统

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

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

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

但现在我已经注意到有更多的function用于写文件,如fs.openfs.close ,我应该使用这些打开或closures文件,而写作?

另外,我注意到有fs.createReadStreamfs.createWriteStream函数,它们和fs.writeFilefs.readFile什么fs.readFile

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

低级别:

fs.open和fs.close在文件描述符上工作。 这些是低级别的函数,并表示打开(2) BSD系统调用的地图调用。 因为你将有一个文件描述符,你可以使用fs.read或fs.write 。

请注意,所有这些都是asynchronous的,并且还有同步版本: fs.openSync , fs.closeSync , fs.readSync , fs.writeSync ,您将不使用callback。 asynchronous和同步版本之间的区别在于fs.openSync只会在打开文件的操作完成时fs.open返回,而fs.open返回,您将在callback中使用文件描述符。

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

中级:

fs.createReadStream和fs.createWriteStream创build可以连接到事件的stream对象。 这些事件的例子是“数据”(当一块数据被读取,但该块只是文件的一部分)或“closures”。 这样做的好处是你可以读取一个文件并在数据进入时处理它,也就是说,你不必读整个文件,把它保存在内存中,然后处理它。 这在处理大文件时很有意义,因为在处理块时可以获得更好的性能,而不是处理整个文件(例如,内存中的整个1GB文件)。

高水平:

fs.readFile和fs.writeFile在整个文件上运行。 所以你会调用fs.readFile ,节点会读取整个文件,然后在callback中显示整个数据。 这样做的好处是你不需要处理不同大小的块(比如使用stream时)。 写入时,节点将写入整个文件。 这种方法的缺点是读/写时,你必须把整个文件放在内存中。 例如,如果您正在转换日志文件,则可能只需要数据行,使用数据stream就可以完成此操作,而无需在开始写入之前等待文件完整读入。

还有, fs.readFileSync和fs.writeFileSync不会使用callback,而是在返回之前等待读/写操作完成。 使用它的好处是,对于一个小文件,在文件返回之前你可能不想做任何事情,但对于大文件,这意味着CPU将在等待文件I / O完成时闲置。

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