Node.js fs模块同步和异步方法的区别
NodeJS为我们提供了一个内置的 文件系统(fs)模块 ,用于各种文件处理操作,如读取文件、写入文件、删除文件等。可以使用以下语句安装fs模块:
语法:
npm install fs --save
注意: 上述命令中的npm代表node package manager,用于在NodeJS中安装所有的依赖项。
要使用fs模块,请将以下语句附加到代码中:
const fs = require('fs');
fs模块具有不同的文件处理操作,例如读文件,写文件,追加文件,关闭文件,删除文件等。可以根据用户的要求以同步或异步的方式执行所有操作。
1.同步方法: 同步函数在执行文件操作之前会阻塞程序的执行。这些函数也被称为阻塞函数。同步方法的最后一个参数是文件描述符。文件描述符是对已打开文件的引用。它是一个数字或文件的引用ID,在使用fs模块的fs.open()方法打开文件后返回的。所有的异步方法都可以通过将“Sync”附加到函数名称来同步执行。NodeJS中fs模块的一些同步方法如下:
- fs.readFileSync()
- fs.renameSync()
- fs.writeSync()
- fs.writeFileSync()
- fs.fsyncSync()
- fs.appendFileSync()
- fs.statSync()
- fs.readdirSync()
- fs.existsSync()
示例1:同步读取方法
步骤1: 让我们创建一个名为 main.js 的JavaScript文件和一个名为 sample.txt 的文本文件,其中包含以下语句:
GeeksForGeeks is a Computer Science portal.
步骤2: 将以下代码添加到 main.js 文件中并执行:
main.js
var fs = require("fs");
// Synchronous read
console.log("Synchronous read method:");
var data = fs.readFileSync('sample.txt');
console.log("Data in the file is - " + data.toString());
输出:
示例2:同步追加方法
步骤1: 让我们创建一个名为 main.js 的JavaScript文件和一个名为 sample.txt 的文本文件,其中包含以下语句:
Hello World !
步骤2: 将下面的代码添加到 main.js 文件内并执行:
main.js
var fs = require("fs");
// Synchronous read
console.log("Synchronous append method:");
var data = "\nGeeksForGeeks is a Computer Science portal.";
// Append data to file
fs.appendFileSync('sample.txt', data, 'utf8');
console.log("Data is appended to file successfully.")
data = fs.readFileSync('sample.txt');
console.log("Data in the file after appending is - \n" + data.toString());
输出:
2. 异步方法:
异步函数不会阻塞程序的执行,每个命令在之前的命令执行完成之后执行,即使之前的命令尚未计算出结果。之前的命令在后台运行,并在处理完成后加载结果。因此,这些函数被称为非阻塞函数。它们将回调函数作为最后一个参数。与同步函数相比,通常更喜欢使用异步函数,因为它们不会阻塞程序的执行,而同步函数会在处理完成之前阻塞程序的执行。在NodeJS的fs模块中有一些异步方法,包括:
- fs.readFile()
- fs.rename()
- fs.write()
- fs.writeFile()
- fs.fsync()
- fs.appendFile()
- fs.stat()
- fs.readdir()
- fs.exists()
对于消耗时间的重型操作,比如从数据库中查询大量数据,应该使用异步方式进行,因为其他操作仍然可以执行,从而减少程序执行的时间。
示例1:异步读取方法
步骤1: 让我们创建一个名为 main.js 的JavaScript文件和一个名为 sample.txt 的文本文件,其中包含以下语句:
GeeksForGeeks is a Computer Science portal.
步骤2: 将以下代码添加到 main.js 文件中并执行:
main.js
var fs = require("fs");
// Asynchronous read
console.log("Asynchronous read method:");
fs.readFile('sample.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("Data in the file is - " + data.toString());
});
输出:
示例2:异步追加方法
步骤1: 让我们创建一个名为 main.js 的JavaScript文件和一个名为 sample.txt 的文本文件。该文本文件中包含以下语句:
Hello World !
步骤2: 在 main.js 文件中添加以下代码并执行:
main.js
var fs = require("fs");
const data = "\nGeeksForGeeks is a Computer Science portal.";
// Asynchronously appending data to file
fs.appendFile('sample.txt', data, 'utf8',
// Callback function
function(err) {
if (err) throw err;
// If no error
console.log("Data is appended to file successfully.")
});
fs.readFile('sample.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("Data in the file after appending: \n"
+ data.toString());
});
输出:
异步和同步方法的区别:
编号 | 同步方法 | 异步方法 |
---|---|---|
1. | 同步函数是阻塞函数 | 异步函数是非阻塞函数。 |
2. | 它阻塞程序的执行,直到文件操作完成处理。 | 它不会阻塞程序的执行。 |
3. | 这些函数将文件描述符作为最后一个参数。 | 这些函数将回调函数作为最后一个参数。 |
4. | 示例:fs.readFileSync()、fs.appendFileSync()、fs.writeFileSync()等。 | 示例:fs.readFile()、fs.appendFile()、fs.writeFile()、fs.stat()等。 |