Node.js - потоки

Что такое потоки?

Потоки - это объекты, которые позволяют вам непрерывно читать данные из источника или записывать данные в место назначения. В Node.js есть четыре типа потоков:

  • Readable - Поток, который используется для операции чтения.

  • Writable - Поток, который используется для операции записи.

  • Duplex - Поток, который можно использовать как для чтения, так и для записи.

  • Transform - Тип дуплексного потока, в котором вывод вычисляется на основе ввода.

Каждый тип потока - это EventEmitterinstance и генерирует несколько событий в разное время. Например, некоторые из наиболее часто используемых событий:

  • data - Это событие запускается, когда есть данные, доступные для чтения.

  • end - Это событие запускается, когда больше нет данных для чтения.

  • error - Это событие вызывается при возникновении ошибки при получении или записи данных.

  • finish - Это событие запускается, когда все данные были сброшены в базовую систему.

Это руководство дает базовое представление о часто используемых операциях с Streams.

Чтение из потока

Создайте текстовый файл с именем input.txt, имеющий следующее содержимое -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Создайте файл js с именем main.js со следующим кодом -

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат -

$ node main.js

Проверьте вывод.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Запись в поток

Создайте файл js с именем main.js со следующим кодом -

var fs = require("fs");
var data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат -

$ node main.js

Проверьте вывод.

Program Ended
Write completed.

Теперь откройте файл output.txt, созданный в вашем текущем каталоге; он должен содержать следующее -

Simply Easy Learning

Прокачка потоков

Конвейер - это механизм, в котором мы обеспечиваем вывод одного потока в качестве ввода для другого потока. Обычно он используется для получения данных из одного потока и передачи вывода этого потока в другой поток. Нет ограничений на операции с трубопроводом. Теперь мы покажем пример конвейера для чтения из одного файла и записи его в другой файл.

Создайте файл js с именем main.js со следующим кодом -

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат -

$ node main.js

Проверьте вывод.

Program Ended

Откройте файл output.txt, созданный в вашем текущем каталоге; он должен содержать следующее -

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Цепочка потоков

Цепочка - это механизм для соединения вывода одного потока с другим потоком и создания цепочки из нескольких потоковых операций. Обычно он используется при работе с трубопроводами. Теперь мы воспользуемся конвейером и цепочкой, чтобы сначала сжать файл, а затем распаковать его.

Создайте файл js с именем main.js со следующим кодом -

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("File Compressed.");

Теперь запустите main.js, чтобы увидеть результат -

$ node main.js

Проверьте вывод.

File Compressed.

Вы обнаружите, что input.txt был сжат и создал файл input.txt.gz в текущем каталоге. Теперь давайте попробуем распаковать тот же файл, используя следующий код -

var fs = require("fs");
var zlib = require('zlib');

// Decompress the file input.txt.gz to input.txt
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
  
console.log("File Decompressed.");

Теперь запустите main.js, чтобы увидеть результат -

$ node main.js

Проверьте вывод.

File Decompressed.