Node.js — Потоки

15

Від автора: в Node js потоки — це об’єкти, які дозволяють вам безперервно зчитувати дані з джерела або записувати дані. В Node.js існує чотири типи потоків .

Readable — потік, який використовується для операції читання.

Writable — потік, який використовується для запису.

Duplex — потік, який може використовуватися як для читання, так і для запису.

Transform — тип дуплексного потоку, в якому висновок обчислюється на основі даних, що вводяться.

Кожен тип потоку є екземпляром EventEmitter і в різний час запускає кілька подій. Нижче наводяться приклади деяких з часто використовуваних подій:

data — це подія відбувається, коли дані стають доступні для читання.

end — ця подія відбувається, коли всі дані зчитані.

error — це подія відбувається, коли виникає якась помилка отримання або запису даних.

finish — це подія відбувається, коли усі дані були скинуті в базову систему.

У цьому посібників описано основні принципи роботи часто використовуваних операцій з потоками.

Читання з потоку

Створіть текстовий файл з ім’ям 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 = «;
// Створення потоку readable
var readerStream = fs.createReadStream(‘input.txt’);
// Установка кодування utf8.
readerStream.setEncoding(‘UTF8’);
// Обробка подій потоку —> data, end і 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’;
// Створення потоку writable
var writerStream = fs.createWriteStream(‘output.txt’);
// Запис даних у потік з встановленою кодування utf8
writerStream.write(data,’UTF8′);
// Помічаємо кінець файлу
writerStream.end();
// Обробка подій потоку —> finish і 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

Пайпинг потоків

Пайпинг — це механізм, за допомогою якого ми надаємо вихідні дані одного потоку в якості вхідних даних для іншого потоку. Зазвичай він використовується для отримання даних одного потоку і передачі їх в інший. В Node не існує обмежень по кількості операцій пайпинга. Нижче наведено приклад операції пайпинга для зчитування даних з одного файлу і запису їх в інший.

Створіть файл з ім’ям js main.js з таким кодом:

var fs = require(«fs»);
// Створення считываемого потоку
var readerStream = fs.createReadStream(‘input.txt’);
// Створення записуваного потоку
var writerStream = fs.createWriteStream(‘output.txt’);
// Пайпинг операцій зчитування і запису
// зчитування input.txt і запис даних у 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’);
// Архівування файлу file input.txt в input.txt.gz
fs.createReadStream(‘input.txt’)
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream(‘input.txt.gz’));
console.log(«Compressed File.»);

Тепер запустіть main.js:

$ node main.js

В результаті ви повинні отримати наступне.

Compressed File.

Input.txt був заархіваваний, і в результаті у поточному каталозі був створений файл input.txt.gz. Тепер давайте спробуємо розпакувати файл, використовуючи наступний код:

var fs = require(«fs»);
var zlib = require(‘zlib’);
// Розпаковуємо файл input.txt.gz в 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.