📜  fs模块的同步和异步方法的区别

📅  最后修改于: 2022-05-13 01:56:43.312000             🧑  作者: Mango

fs模块的同步和异步方法的区别

NodeJS 为我们提供了一个内置的fs(文件系统)模块 对于各种文件处理操作,如读取文件、写入文件、删除文件等。可以使用以下语句安装 fs 模块:

句法:

npm install fs --save

注意:上面命令中的 npm 代表节点包管理器,所有依赖项都可以从这里安装到 NodeJS 中。

要使用 fs 模块,请在代码中附加以下语句:

const fs = require('fs');

fs 模块具有不同的文件处理操作,例如读取文件、写入文件、追加文件、关闭文件、删除文件等。所有操作都可以根据用户要求以同步和异步方式执行。

1、同步方法:同步函数会阻塞程序的执行,直到执行文件操作。这些函数也称为阻塞函数。同步方法将文件描述符作为最后一个参数。文件描述符是对打开文件的引用。它是使用 fs 模块的 fs.open() 方法打开文件后返回的文件的数字或引用 id。所有异步方法都可以通过在函数名后面加上“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());


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());


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());
});


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());
 });


输出:

同步读取方法的输出

示例 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());
 });

输出:

异步追加方法的输出

异步和同步方法的区别:

Sr.no

Synchronous methods

Asynchronous methods

1.Synchronous functions are called blocking functionsAsynchronous functions are called non-blocking functions.
2.It blocks the execution of the program until the file operation has finished processing.It does not block the execution of the program.
3.These functions take File Descriptor as the last argument.These functions take a callback function as the last argument.
4.Examples: fs.readFileSync(), fs.appendFileSync(), fs.writeFileSync() etc.Examples: fs.readFile(), fs.appendFile(), fs.writeFile(), fs.stat() etc.