PassFront
  1. PassFront
  2. База знаний
  3. Потоки и буферы

Чем отличаются fs.readFile и fs.createReadStream?

Потоки и буферы

`readFile` загружает весь файл в память целиком, `createReadStream` читает его порциями.

Когда что выбрать

  • readFile удобен для небольших файлов: конфигов, шаблонов, JSON. Код проще, результат сразу весь.
  • createReadStream нужен для больших файлов и раздачи по сети: память расходуется по чанкам, ответ клиенту начинается сразу.
import { readFile } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';

// Небольшой файл
const text = await readFile('./settings.json', 'utf8');

// Большой файл в HTTP-ответ
app.get('/video', async (req, res) => {
  await pipeline(createReadStream('./video.mp4'), res);
});

Подвохи

  • readFile на файле в гигабайты вызовет рост памяти и может упасть.
  • Для потока важно обработать ошибку: без pipeline или обработчика error она станет необработанным исключением.
  • Синхронные readFileSync блокируют Event Loop и допустимы только при старте приложения.

Коротко для собеседования

Малое читаем целиком, большое потоком. В обоих случаях используем асинхронный API.

Другие вопросы раздела