Node.js fs.readFileSync() 方法
fs.readFileSync() 方法是 fs 模块的内置应用程序编程接口,用于读取文件并返回其内容。
在 fs.readFile() 方法中,我们可以以非阻塞异步方式读取文件,而在 fs.readFileSync() 方法中,我们可以以同步方式读取文件,即告诉 node.js 阻塞其他并行处理并执行当前文件读取过程。即当调用 fs.readFileSync() 方法时,原节点程序停止执行,节点等待 fs.readFileSync()函数执行完毕,得到方法结果后,执行剩余节点程序。
句法:
fs.readFileSync( path, options )
参数:
- path:它采用文本文件的相对路径。路径可以是 URL 类型。该文件也可以是文件描述符。如果两个文件都在同一个文件夹中,只需将文件名放在引号中即可。
- options:它是一个可选参数,包含编码和标志,编码包含数据规范。它的默认值为null ,它返回原始缓冲区,并且标志包含文件中操作的指示。它的默认值为'r'。
返回值:此方法返回文件的内容。
示例 1:
- input.txt 文件内容:
This is some text data which is stored in input.txt file.
- index.js 文件:
javascript
// Node.js program to demonstrate the
// fs.readFileSync() method
// Include fs module
const fs = require('fs');
// Calling the readFileSync() method
// to read 'input.txt' file
const data = fs.readFileSync('./input.txt',
{encoding:'utf8', flag:'r'});
// Display the file data
console.log(data);
javascript
// Node.js program to demonstrate the
// fs.readFileSync() method
// Include fs module
const fs = require('fs');
// Calling the fs.readFile() method
// for reading file 'input1.txt'
fs.readFile('./input1.txt',
{encoding:'utf8', flag:'r'},
function(err, data) {
if(err)
console.log(err);
else
console.log(data);
});
// Calling the fs.readFileSync() method
// for reading file 'input2.txt'
const data = fs.readFileSync('./input2.txt',
{encoding:'utf8', flag:'r'});
// Display data
console.log(data);
输出:
This is some text data which is stored in input.txt file.
现在,问题是这个 fs.readFileSync() 方法与 fs.readFile() 方法有何不同。我们可以找出何时使用 fs.readFileSync() 和 fs.readFile() 方法的示例。
假设有两个输入文件input1.txt和input2.txt并且两个文件都保存在同一个文件夹中。
示例 2:
- input1.txt 文件内容:
(1) This is some text data which is stored in input1.txt file.
- input2.txt 文件内容:
(2) This is some text data which is stored in input2.txt file.
- index.js 文件:
javascript
// Node.js program to demonstrate the
// fs.readFileSync() method
// Include fs module
const fs = require('fs');
// Calling the fs.readFile() method
// for reading file 'input1.txt'
fs.readFile('./input1.txt',
{encoding:'utf8', flag:'r'},
function(err, data) {
if(err)
console.log(err);
else
console.log(data);
});
// Calling the fs.readFileSync() method
// for reading file 'input2.txt'
const data = fs.readFileSync('./input2.txt',
{encoding:'utf8', flag:'r'});
// Display data
console.log(data);
输出:
(2) This is some text data which is stored in input2.txt file.
(1) This is some text data which is stored in input1.txt file.
观察:我们可以观察到,当我们调用读取'input1.txt'的 fs.readFile() 方法,然后我们调用读取'input2.txt'文件的 fs.readFileSync() 方法时,但看到输出我们发现先读取'input2.txt '文件然后读取'input1.txt'文件,这是因为当编译器编译node.js文件时,它首先调用读取文件的fs.readFile()方法,但并行它也继续编译剩余的程序,之后它调用读取另一个文件的fs.readFileSync()方法,当调用readFileSync()方法时,编译器停止其他并行进程(这里是读取 'input1.txt' 文件从readFile()方法)并继续正在进行的过程直到结束,每当正在进行的过程结束时,编译器就会恢复剩余的过程,这就是为什么我们观察到首先打印'input2.txt'的内容而不是'input1.txt' 的原因。因此,我们可以将fs.readFileSync()方法用于暂停其他并行进程和同步读取文件等任务。
参考: https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options