Потоки чтения и записи в NodeJS

Представим, что у вас есть достаточно большой файл, скажем размером в 100 мегабайт. Пусть мы хотим что-то сделать с данными этого файла. Очевидно, что для этого нужно прочитать содержимое этого файла в переменную:

let data = await fs.promises.readFile('readme.txt', 'utf8'); console.log(data);

Проблема в том, что в таком случае все 100 мегабайт нашего файла попадут в оперативную память сервера. Поэтому попытка одновременно прочитать десяток-другой таких файлов запросто исчерпает доступную нам память сервера, что приведет к его падению.

Для решения такой проблемы придуманы потоки. Потоки позволяют прочитывать файл по кусочкам. Давайте посмотрим, как это делается. Для начала создадим поток чтения с помощью метода createReadStream:

let readableStream = fs.createReadStream('readme.txt', 'utf8');

Теперь прочитаем наш файл по кусочкам:

readableStream.on('data', function(chunk) { console.log(chunk); });

Сделайте файл достаточно большого размера. Прочитайте его по кусочкам и выведите каждый кусочек в консоль.

Потоки записи

Можно также создавать потоки записи. Это делается с помощью метода createWriteStream:

let writeableStream = fs.createWriteStream('writeme.txt');

Давайте что-нибудь запишем в наш поток с помощью метода write:

writeableStream.write('text1\n'); writeableStream.write('text2\n'); writeableStream.write('text3\n');

Завершим процедуру записи с помощью метода end:

writeableStream.end();

Запишите в файл столбец чисел от одного до миллиона.

Чтение и запись

Можно прочитывать один файл, записывая по частям его данные в другой файл:

let readableStream = fs.createReadStream('readme.txt', 'utf8'); let writeableStream = fs.createWriteStream('writeme.txt'); readableStream.on('data', function(chunk) { writeableStream.write(chunk); });

Дан файл большого размера. Напишите код, который сделает три копии этого файла.