Учебное пособие по Node js Streams: файловый поток, каналы

Файловый поток в Node.js

Node широко использует потоки в качестве механизма передачи данных.

Например, когда вы выводите что-либо на консоль с помощью функции console.log, вы фактически используете поток для отправки данных на консоль.

Node.js также имеет возможность потоковой передачи данных из файлов, чтобы их можно было читать и записывать соответствующим образом. Теперь мы рассмотрим пример того, как мы можем использовать потоки для чтения и записи файлов. Для этого примера нам нужно выполнить следующие шаги.

Шаг 1) Создайте файл data.txt, содержащий приведенные ниже данные. Предположим, этот файл хранится на диске D нашей локальной машины.

Учебник по Node.js

Введение

Мероприятия

Generators

Подключение данных

Использование жасмина

Шаг 2) Напишите соответствующий код, который будет использовать потоки для чтения данных из файла.

Файловый поток в Node.js

var fs = require("fs");
var stream;
stream = fs.createReadStream("D://data.txt");

stream.on("data", function(data) {
    var chunk = data.toString();
    console.log(chunk);
}); 

Объяснение кода: -

  1. Сначала нам нужно включить модули fs, которые содержат все функции, необходимые для создания потоков.
  2. Далее мы создаем читаемый поток, используя метод createReadStream. В качестве входных данных мы указываем расположение нашего файла data.txt.
  3. Функция Steam.on является обработчиком событий, и в ней мы указываем первый параметр как «данные». Это означает, что всякий раз, когда данные поступают в поток из файла, выполняется функция обратного вызова. В нашем случае мы определяем функцию обратного вызова, которая будет выполнять два основных шага. Первый — преобразовать данные, считанные из файла, в строку. Второй — отправить преобразованную строку в качестве вывода на консоль.
  4. Мы берем каждый фрагмент данных, считываемый из потока данных, и преобразуем его в строку.
  5. Наконец, мы отправляем выходные данные каждого фрагмента преобразованной строки на консоль.

Вывод:

Файловый поток в Node.js

  • Если код выполнен правильно, вы увидите приведенный выше вывод в консоли. Этот вывод будет таким же, как в файле data.txt.

Запись в файл

Точно так же, как мы создаем поток чтения, мы также можем создать поток записи для записи данных в файл. Давайте сначала создадим пустой файл без содержимого с именем data.txt. Предположим, этот файл находится на диске D нашего компьютера.

Код ниже показывает, как мы можем записать данные в файл.

Файловый поток в Node.js

var fs = require("fs");
var stream;
stream = fs.createWriteStream("D://data.txt");

stream.write("Tutorial on Node.js")
stream.write("Introduction")
stream.write("Events")
stream.write("Generators")
stream.write("Data Connectivity")
stream.write("Using Jasmine") 

Объяснение кода: -

  1. Мы создаем записываемый поток, используя метод createWriteStream. В качестве входных данных мы указываем расположение нашего файла data.txt.
  2. Затем мы использовали методstream.write для записи различных строк текста в наш текстовый файл. Поток позаботится о записи этих данных в файл data.txt.

Если вы откроете файл data.txt, вы увидите в нем следующие данные:

Учебник по Node.js

Введение

Мероприятия

Generators

Подключение данных

. жасмин

Трубы в Node.js

В приложениях Node потоки можно объединять вместе с помощью метода Pipe(), который принимает два аргумента:

  • Обязательный записываемый поток, который выступает в качестве места назначения для данных и
  • Необязательный объект, используемый для передачи параметров.

Типичный пример использования каналов, если вы хотите передать данные из одного файла в другой.

Итак, давайте посмотрим пример того, как мы можем передавать данные из одного файла в другой с помощью каналов.

Шаг 1) Создайте файл datainput.txt, содержащий приведенные ниже данные. Предположим, этот файл хранится на диске D нашей локальной машины.

Учебник по Node.js

Введение

Мероприятия

Generators

Подключение данных

Использование жасмина

Шаг 2) Создайте пустой файл с именем dataOutput.txt и поместите его на диск D вашего локального компьютера.

Шаг 3) Напишите приведенный ниже код, чтобы выполнить передачу данных из файла datainput.txt в файл dataOutput.txt.

Трубы в Node.js

var fs = require("fs");
var readStream = fs.createReadStream("D://datainput.txt");
var writeStream = fs.createWriteStream("D://dataOutput.txt");
readStream.pipe(writeStream);

Объяснение кода: -

  1. Сначала мы создаем «поток чтения» для нашего файла datainput.txt, который содержит все наши данные, которые необходимо перенести в новый файл.
  2. Затем нам нужно создать «поток записи» для нашего файла dataOutput.txt, который является нашим пустым файлом и является местом назначения для передачи данных из файла datainput.txt.
  3. Затем мы используем команду Pipe для передачи данных из потока чтения в поток записи. Команда канала возьмет все данные, поступающие в поток чтения, и отправит их в поток записи.

Если вы теперь откроете файл dataOutput.txt, вы увидите все данные, которые присутствовали в файле datainput.txt.

События в Node.js

События — одна из ключевых концепций Node.js, и иногда Node.js называют платформой, управляемой событиями.

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

Давайте рассмотрим базовый пример определения события в Node.js.

Мы собираемся создать событие под названием «data_received». При срабатывании этого события на консоль будет отправлен текст «данные получены».

События в Node.js

var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('data_received', function() {
    console.log('data received succesfully.');
});

eventEmitter.emit('data_received'); 

Объяснение кода: -

  1. Используйте функцию require, чтобы включить модуль «события». С помощью этого модуля вы сможете создавать события в Node.js.
  2. Создайте новый излучатель событий. Это используется для привязки события (в нашем случае «data_received») к функции обратного вызова, определенной на шаге 3.
  3. Мы определяем функцию, управляемую событиями, которая говорит, что если в случае срабатывания события «data_received», мы должны вывести текст «data_received» на консоль.
  4. Наконец, у нас есть ручной запуск нашего события с помощью функции eventEmiter.emit. Это вызовет событие data_received.

Когда программа запустится, текст «данные получены» будет отправлен на консоль, как показано ниже.

События в Node.js

Отправка событий

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

  1. Одноразовые обработчики событий

Иногда вам может быть интересно отреагировать на событие только в первый раз, когда оно происходит. В таких ситуациях вы можете использовать метод Once().

Давайте посмотрим, как мы можем использовать метод Once для обработчиков событий.

Отправка событий

Объяснение кода: -

  1. Здесь мы используем метод «один раз», чтобы сказать, что для события «data_received» функция обратного вызова должна выполняться только один раз.
  2. Здесь мы вручную запускаем событие data_received.
  3. Когда событие data_received сработает снова, на этот раз ничего не произойдет. Это связано с тем, что на первом этапе мы сказали, что событие может быть вызвано только один раз.

Если код выполнен правильно, вывод в журнале будет «данные_получены успешно». Это сообщение появится в консоли только один раз.

  1. Проверка прослушивателей событий

В любой момент своего существования к эмиттеру событий может быть подключено ноль или более прослушивателей. Прослушиватели каждого типа событий можно проверить несколькими способами.

Если вас интересует только определение количества подключенных прослушивателей, не ищите ничего, кроме метода EventEmitter.listenerCount().

(Примечание: Прослушиватели важны, поскольку основная программа должна знать, добавляются ли прослушиватели к событию на лету, иначе программа будет работать неправильно, поскольку будут вызваны дополнительные прослушиватели.)

Отправка событий

Объяснение кода: -

  1. Мы определяем тип eventEmitter, который необходим для использования методов, связанных с событиями.
  2. Затем мы определяем объект с именем эмиттер, который будет использоваться для определения наших обработчиков событий.
  3. Мы создаем два обработчика событий, которые по сути ничего не делают. В нашем примере это сделано просто, чтобы показать, как работает метод ListenerCount.
  4. Теперь, когда вы вызываете метод ListenerCount для нашего события data_received, он отправляет количество прослушивателей событий, прикрепленных к этому событию, в журнал консоли.

Если код выполнен правильно, в журнале консоли будет показано значение 2.

  1. Событие newListener

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

Отправка событий

var events = require('events');
var eventEmitter = events.EventEmitter;
var emitter = new eventEmitter();
emitter.on("newListener", function(eventName, listener) {
    console.log("Added listener for " + eventName + " events");
});
emitter.on('data_received', function() {});
emitter.on('data_received', function() {}); 

Объяснение кода: -

  1. Мы создаем новый обработчик событий для события newListener. Поэтому всякий раз, когда регистрируется новый обработчик событий, в консоли будет отображаться текст «Добавлен прослушиватель для» + имя события.
  2. Здесь пишем в консоль текст «Добавлен прослушиватель для» + имя события для каждого зарегистрированного события.
  3. Мы определяем два обработчика событий для нашего события data_received.

Если приведенный выше код выполнен правильно, в консоли отобразится приведенный ниже текст. Это просто показывает, что обработчик событий newListener был запущен дважды.

Добавлен прослушиватель событий data_received.

Добавлен прослушиватель событий data_received.

Итого

  • Потоки используются в Node.js для чтения и записи данных с устройств ввода-вывода. Node.js использует библиотеку fs для создания читаемых и записываемых потоков в файлы. Эти потоки можно использовать для чтения и записи данных из файлов.
  • Трубы можно использовать для соединения нескольких потоков вместе. Одним из наиболее распространенных примеров является объединение потоков чтения и записи для передачи данных из одного файла в другой.
  • Node.js часто также называют инфраструктурой, управляемой событиями, и в Node.js очень легко определять события. Могут быть определены функции, реагирующие на эти события.
  • События также предоставляют методы реагирования на ключевые события. Например, мы видели обработчик событий Once(), который можно использовать, чтобы гарантировать, что функция обратного вызова выполняется только один раз при запуске события.