Потоки чтения и записи в 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);
});