Node.js естественно асинхронно и управляется событиями и идеально подходит для выполнения задач, связанных с вводом-выводом. Если вы имеете дело с операциями, связанными с вводом/выводом в своем приложении, вы можете воспользоваться потоками в node.js. Поэтому давайте подробно рассмотрим потоки и поймем, как они упрощают операции ввода -вывода.
Что такое поток
Потоки - это трубопроводы Unix, которые позволяют легко считывать данные из источника данных, а затем переходить к другому пункту назначения.
Проще говоря, потоковая передача не является чем -то особенным, это просто события, который реализует некоторые методы. Согласно методу, который он реализует, поток может стать читаемым потоком (читаемого), писательского потока (записываемого) или двунаправленным потоком (дуплекс, читаемый и записываемый).
Читаемый поток позволяет читать данные из источника данных, в то время как записываемый поток позволяет записывать данные в пункт назначения.
Если вы использовали node.js, вы, вероятно, столкнулись с потоковой передачей.
Например, на http -сервере Node.js запрос - это читаемый поток, а ответ - это поток для записи.
Возможно, вы также использовали модуль FS, который может помочь вам справиться с читаемыми и записи, которые можно записать.
Теперь позвольте вам выучить некоторые основы и понять различные типы потоков. В этой статье будут обсуждаться читаемые и записываемые потоки. Двунаправленные потоки выходят за рамки этой статьи, и мы не будем их обсуждать.
Читаемые потоки
Мы можем использовать читаемый поток для чтения данных из источника данных, который может быть чем угодно, например, файл в системе, буфер в памяти или даже другие потоки. Поскольку потоки являются событиями, они отправляют данные с различными событиями. Мы будем использовать эти события, чтобы заставить поток работать.
Читать данные из потока
Лучший способ прочитать данные из потока - прослушать события данных и добавить функцию обратного вызова. Когда данные переходят, читаемый поток отправит событие данных, а функция обратного вызова будет запускаться. Посмотрите на следующий фрагмент кода:
var fs = require ('fs'); var pertableStream = fs.createreadStream ('file.txt'); var data = ''; var pertableStream.on ('data', function (chunk) {data += Chunk;}); recementeReam.on ('end', function () {console.log (data);});fs.createreadstream даст вам читаемый поток.
Вначале этот поток не был динамическим потоком. Когда вы добавляете слушатель событий Data и добавляете функцию обратного вызова, он станет текущим. После этого он будет читать небольшой кусочек данных и передавать его в вашу функцию обратного вызова.
Реализатор потока определяет частоту триггеров события данных. Например, HTTP -запрос запустит событие данных при чтении нескольких KBS данных. Когда вы читаете данные из файла, вы можете принять решение запустить событие данных, когда строка закончена.
Когда нет данных для чтения (когда он читается в конце файла), поток отправит конечное событие. В приведенном выше примере мы прослушали это событие и распечатали данные, когда закончили чтение файла.
Есть еще один способ читать потоки. Вам просто нужно продолжать вызывать метод read () в экземпляре потока, прежде чем читать до конца файла.
var fs = require ('fs'); var pertableStream = fs.createreadStream ('file.txt'); var data = ''; var chunk; recatebleStream.on ('retable', function () {while ((chunk = pertableStream.read ()! = null) {data += chunk;}); console.log (data);});Метод read () считывает данные из внутреннего буфера и возвращает NULL, когда нет данных для чтения.
Поэтому, в цикле Whice мы проверяем, возвращает ли read () NULL, и когда он возвращает NULL, цикл будет прекращен.
Следует отметить, что когда мы сможем прочитать данные из потока, читаемое событие будет запущено.
Установить кодирование
По умолчанию то, что вы читаете из потока, является буферным объектом. Если вы читаете строку, это не для вас. Следовательно, вы можете установить кодирование потока, вызывая redectable.setencoding (), как в следующем примере:
var fs = require ('fs'); var pertableStream = fs.createreadStream ('file.txt'); var data = ''; receplableStream.setEncoding ('UTF8'); recementEream.on ('data', function (chunk) {data += chunk;}); readableam.on ('end', function () {usole.В приведенном выше примере, если мы установим кодирование потока в UTF8, данные будут проанализированы в UTF8, а кусок в функции обратного вызова будет строкой.
Трубопровод
Трубопроводы - это отличный механизм, в котором вы можете читать данные из источника данных, не управляя состоянием потока самостоятельно и не записывать их в пункт назначения. Давайте посмотрим на следующий пример:
var fs = require ('fs'); var pertableStream = fs.createreadStream ('file1.txt'); var wriseableStream = fs.createwRiteStream ('file2.txt'); readableStream.pipe (wriseableStream);Приведенный выше пример использует метод Pipe () для записи содержимого файла1 в файл2. Поскольку Pipe () поможет вам управлять потоком данных, вам не нужно беспокоиться о скорости потока данных. Это делает Pipe () очень простым и простым в использовании.
Следует отметить, что Pipe () возвращает поток назначения, поэтому вы можете легко связать несколько потоков!
Ссылка (цепочка)
Предположим, есть архивный файл, и вы хотите расстегнуть его. Есть много способов выполнить эту задачу. Но самый простой способ - использовать трубопроводы и ссылки:
var fs = require ('fs'); var zlib = require ('zlib'); fs.createreadStream ('input.txt.gz') .pipe (zlib.creategunzip ()) .pipe (fs.createwritestream ('output.txt'));Сначала мы создаем читаемый поток через input.txt.gz, а затем позволяем ему транслировать поток zlib.creategunzip (), который декомпрессирует содержимое. Наконец, мы добавляем поток для записи, чтобы написать декомпрессированный контент в другой файл.
Другие методы
Мы обсудили некоторые важные понятия в читаемых потоках, и вот некоторые способы знать:
1. readleable.pause () Этот метод приостановит поток потока. Другими словами, это больше не запустит событие данных.
2. Метод readleable.resume () является противоположностью вышеупомянутого и позволит потоку паузы возобновить поток.
3. readleable.unpipe () Метод удалит пункт назначения. Если приведены параметры, это позволит читаемому потоку остановить конкретное направление Лю Сян, в противном случае он удалит все направления.
Записываемые потоки
Записенный поток позволяет записывать данные в пункт назначения. Так же, как читаемые потоки, это Eventemitters, и они также вызывают различные события. Давайте посмотрим на события и методы, которые будут вызваны в писательном потоке.
Напишите в потоку
Чтобы записать данные в виде записи, вам необходимо вызвать метод записи () в экземпляре потока записи и посмотреть следующий пример:
var fs = require ('fs'); var pertableStream = fs.createreadStream ('file1.txt'); var wriseableStream = fs.createwRitestream ('file2.txt'); recebleStream.setEncoding ('utf8'); recementErestream.on ('data', function (chunk) {writebleGream.Приведенный выше код очень прост, он просто считывает данные из входного потока и записывает их в пункт назначения с помощью write ().
Этот метод возвращает логическое значение, чтобы указать, является ли запись успешной. Если возвращение True, это означает, что запись успешна, и вы можете продолжать писать больше данных. Если это неверно, это означает, что что -то произошло, и вы не можете продолжать писать сейчас. Записенный поток запускает сливное событие, чтобы сказать вам, что вы можете продолжить написание данных.
После написания данных
Когда вам не нужно писать данные, вы можете вызвать метод End (), чтобы сообщить потоку, который вы закончили писать. Предполагая, что RES является объектом ответа HTTP, вы обычно отправляете ответ в браузер:
res.write ('некоторые данные !!');
res.end ();
Когда называется End (), все данные записаны, и поток будет запустить концовое событие. Обратите внимание, что после вызова End () вы больше не можете записывать данные в писательную поток. Например, следующий код сообщит об ошибке:
res.write ('некоторые данные !!');
res.end ();
res.write («Попытка написать снова»); //Ошибка !
Вот несколько важных событий, связанных с записи, доступными для записи:
1. Очерки сжигают, когда возникает ошибка в письменной форме или связывании
2. Перепись Когда читаемый поток связан с записью на записи, это событие запустит
3. Unpipe будет стрелять, когда не вызывается UNPIPE по читаемому потоку
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.