Node.js 使用

readFile、readFileSync、fsPromises.readFile、createReadStream

  • readFile:异步读取文件
  • readFileSync:同步读取文件
  • fsPromises.readFilepromise 的写法
提示
需要注意的是,前三个方法,如果不指定 编码(options.encoding) 则数据作为 <Buffer> 返回,否则数据为字符串。

Node.js 中,readFilereadFileSyncfs.promises.readFilecreateReadStream 都是用于读取文件的方式,但它们的工作方式和适用场景有所不同。以下是它们的区别:

  1. fs.readFile
  • 特点: 异步读取文件,非阻塞。
  • 用法: 通过回调函数处理读取结果。
  • 适用场景: 适合需要异步处理的场景,尤其是当你不希望阻塞主线程时。
  • 示例:
1
2
3
4
5
6
7
8
9
const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

  1. fs.readFileSync
  • 特点: 同步读取文件,阻塞主线程。
  • 用法: 直接返回文件内容,适合简单脚本或初始化时使用。
  • 适用场景: 适合在脚本启动时需要立即读取文件的场景,但不推荐在高并发应用中使用。
  • 示例:
1
2
3
4
5
6
7
8
const fs = require('fs');

try {
  const data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

  1. fs.promises.readFile
  • 特点: 基于 Promise 的异步读取文件。
  • 用法: 使用 async/await.then() 处理结果。
  • 适用场景: 适合现代异步代码风格,尤其是需要链式调用或与其他异步操作结合时。
  • 示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readFile();

  1. fs.createReadStream
  • 特点: 创建一个可读流,逐块读取文件内容。
  • 用法: 适合处理大文件,避免一次性加载整个文件到内存。
  • 适用场景: 适合读取大文件或需要流式处理的场景(如文件传输、逐行处理)。
  • 示例:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const fs = require('fs');

const stream = fs.createReadStream('example.txt', { encoding: 'utf8' });

stream.on('data', (chunk) => {
  console.log('Received chunk:', chunk);
});

stream.on('end', () => {
  console.log('File reading completed.');
});

stream.on('error', (err) => {
  console.error(err);
});

总结对比

方法 异步/同步 返回类型 内存占用 适用场景
fs.readFile 异步 回调函数 小文件,非阻塞读取
fs.readFileSync 同步 文件内容 简单脚本或初始化时
fs.promises.readFile 异步 Promise 现代异步代码风格
fs.createReadStream 异步 可读流 (Stream) 大文件或流式处理

选择哪种方法取决于你的具体需求,例如文件大小、是否需要异步处理、以及内存使用的限制等。


0%