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.