DEV Community

Cover image for Node.js Stream এবং Buffer
Tanvir Ahmed
Tanvir Ahmed

Posted on

Node.js Stream এবং Buffer

💻 Node.js: Buffer (বাফার)

Buffer হলো Node.js-এর একটি বিল্ট-ইন ক্লাস যা বাইনারি ডেটা পরিচালনার জন্য ব্যবহৃত হয়। JavaScript সাধারণত স্ট্রিং এবং অবজেক্ট নিয়ে কাজ করে, কিন্তু ফাইল, নেটওয়ার্ক ডেটা বা অন্যান্য বাইনারি ডেটা প্রক্রিয়াকরণের জন্য Buffer ব্যবহার করা হয়। Buffer হলো একটি ফিক্সড-সাইজের মেমরি ব্লক যা বাইনারি ডেটা স্টোর করে।

Buffer-এর মূল বৈশিষ্ট্য:

বাইনারি ডেটা সরাসরি ম্যানিপুলেট করার জন্য ব্যবহৃত হয়।
এটি ArrayBuffer-এর মতো কিন্তু আরও ফ্লেক্সিবল এবং Node.js-এর জন্য অপটিমাইজড।
কোনো এনকোডিং ছাড়াই কাঁচা (raw) ডেটা স্টোর করতে পারে।


const buf = Buffer.from('Hello', 'utf8');

console.log(buf);
// আউটপুট: <Buffer 48 65 6c 6c 6f>

console.log(buf.toString());
// আউটপুট: Hello
Enter fullscreen mode Exit fullscreen mode

💻 Node.js: Stream (স্ট্রীম)

Stream হলো Node.js-এর একটি শক্তিশালী ফিচার যা ডেটাকে ছোট ছোট অংশে (chunks) প্রক্রিয়া করতে দেয়। এটি বড় ফাইল বা নেটওয়ার্ক ডেটা পরিচালনার জন্য উপযোগী, কারণ পুরো ডেটা একসাথে মেমরিতে লোড করার প্রয়োজন হয় না।

Stream-এর প্রকারভেদ:

  • Readable Stream: ডেটা পড়ার জন্য (যেমন: ফাইল থেকে পড়া, HTTP রিকোয়েস্ট থেকে ডেটা পড়া)।
  • Writable Stream: ডেটা লেখার জন্য (যেমন: ফাইলে লেখা, HTTP রেসপন্সে লেখা)।
  • Duplex Stream: পড়া এবং লেখা উভয়ই সম্ভব (যেমন: TCP সকেট)।
  • Transform Stream: ডেটা পড়া এবং লেখার সময় মডিফাই করা যায় (যেমন: কম্প্রেশন)।

Stream-এর সুবিধা:

  • মেমরি দক্ষতা: বড় ফাইল বা ডেটা প্রক্রিয়াকরণে কম মেমরি ব্যবহার করে।
  • দ্রুততা: ডেটা চাঙ্কে প্রক্রিয়া হওয়ায় অপেক্ষার সময় কমে।
  • পাইপলাইন: এক স্ট্রিম থেকে আরেক স্ট্রিমে ডেটা পাঠানো সহজ।

Readable Stream উদাহরণ:

const fs = require('fs');

// Readable Stream তৈরি
const readStream = fs.createReadStream('input.txt', { encoding: 'utf8' });

// ডেটা পড়া
readStream.on('data', (chunk) => {
  console.log('নতুন চাঙ্ক পাওয়া গেছে:');
  console.log(chunk);
});

// স্ট্রিম শেষ হলে
readStream.on('end', () => {
  console.log('ডেটা পড়া শেষ।');
});

// ত্রুটি হ্যান্ডলিং
readStream.on('error', (err) => {
  console.error('ত্রুটি:', err);
});
Enter fullscreen mode Exit fullscreen mode

Writable Stream উদাহরণ:

const fs = require('fs');

// Writable Stream তৈরি
const writeStream = fs.createWriteStream('output.txt');

// স্ট্রিমে ডেটা লেখা
writeStream.write('এটি একটি টেস্ট ডেটা।\n', 'utf8');
writeStream.write('আরেকটি লাইন।\n', 'utf8');

// স্ট্রিম বন্ধ করা
writeStream.end();

// লেখা শেষ হলে
writeStream.on('finish', () => {
  console.log('ডেটা লেখা শেষ।');
});

// ত্রুটি হ্যান্ডলিং
writeStream.on('error', (err) => {
  console.error('ত্রুটি:', err);
});
Enter fullscreen mode Exit fullscreen mode

পাইপিং (Piping) উদাহরণ:
পাইপিং হলো একটি Readable Stream থেকে ডেটা সরাসরি Writable Stream-এ পাঠানোর প্রক্রিয়া।

const fs = require('fs');

const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');

// পাইপিং
readStream.pipe(writeStream);

console.log('ডেটা পাইপ করা হয়েছে।');
Enter fullscreen mode Exit fullscreen mode

Transform Stream উদাহরণ:
Transform Stream ডেটাকে মডিফাই করে। নিচে একটি উদাহরণ দেওয়া হলো যেখানে ডেটাকে বড় হাতের অক্ষরে রূপান্তর করা হচ্ছে।

const { Transform } = require('stream');

const upperCaseTransform = new Transform({
  transform(chunk, encoding, callback) {
    this.push(chunk.toString().toUpperCase());
    callback();
  }
});

process.stdin.pipe(upperCaseTransform).pipe(process.stdout);
Enter fullscreen mode Exit fullscreen mode

💻 উপসংহার

Node.js-এ Buffer এবং Stream হলো শক্তিশালী টুল যা বাইনারি ডেটা এবং বড় ডেটা সেট পরিচালনার জন্য ব্যবহৃত হয়। Buffer ব্যবহার করা হয় ছোট ডেটা ম্যানিপুলেশনের জন্য, আর Stream ব্যবহার করা হয় মেমরি-দক্ষ উপায়ে বড় ডেটা প্রক্রিয়াকরণের জন্য। এগুলো ব্যবহার করে ফাইল সিস্টেম, নেটওয়ার্কিং এবং ডেটা প্রসেসিংয়ে দক্ষতা বাড়ানো যায়।

Top comments (0)