困惑node.js的文件系统

问题描述:

我用写的NodeJS文件中的两个步骤:困惑node.js的文件系统

1.首先判断文件是否存在与否,使用fs.exists功能;

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

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

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

这是我会怎么解释的差异:

低级别:文件描述符

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