2012-08-14 55 views
9

我用寫的NodeJS文件中的兩個步驟:困惑node.js的文件系統

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

2.然後用fs.writeFile直接寫文件;

但現在我注意到有更多的功能用於寫入文件,如fs.openfs.close,我應該在寫入時使用這些用於打開還是關閉文件?

另外,我注意到有fs.createReadStreamfs.createWriteStream函數,它們和fs.writeFilefs.readFile有什麼不同?

回答

29

這是我會怎麼解釋的差異:

低級別:文件描述符

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