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 = '';

// 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

วางท่อสตรีม

Piping เป็นกลไกที่เราจัดเตรียมเอาต์พุตของสตรีมหนึ่งเป็นอินพุตไปยังสตรีมอื่น โดยปกติจะใช้เพื่อรับข้อมูลจากสตรีมหนึ่งและส่งเอาต์พุตของสตรีมนั้นไปยังสตรีมอื่น ไม่มีข้อ จำกัด ในการเดินท่อ ตอนนี้เราจะแสดงตัวอย่างท่อสำหรับการอ่านจากไฟล์หนึ่งและเขียนไปยังไฟล์อื่น

สร้างไฟล์ 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!!!!!

การเชื่อมโยงสตรีม

Chaining เป็นกลไกในการเชื่อมต่อเอาต์พุตของสตรีมหนึ่งกับสตรีมอื่นและสร้างห่วงโซ่ของการดำเนินการหลายสตรีม โดยปกติจะใช้กับการเดินท่อ ตอนนี้เราจะใช้การไพพ์และโซ่เพื่อบีบอัดไฟล์ก่อนแล้วจึงคลายการบีบอัดไฟล์เดียวกัน

สร้างไฟล์ 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.