Учебники

Node.js — потоки

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

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

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

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

  • Преобразование — тип дуплексного потока, в котором выход вычисляется на основе входных данных.

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

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

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

Преобразование — тип дуплексного потока, в котором выход вычисляется на основе входных данных.

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

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

  • end — это событие вызывается, когда больше нет данных для чтения.

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

  • завершить — это событие вызывается, когда все данные были сброшены в базовую систему.

data — это событие вызывается, когда есть данные, доступные для чтения.

end — это событие вызывается, когда больше нет данных для чтения.

error — это событие вызывается при любой ошибке при получении или записи данных.

завершить — это событие вызывается, когда все данные были сброшены в базовую систему.

Это руководство дает базовое представление о наиболее часто используемых операциях в 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 со следующим кодом —

Live Demo

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

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