সব ডেটা টেক্সট নয়। ছবি, ভিডিও, আর PDF হলো বাইনারি ডেটা — কাঁচা বাইট যা পড়ার যোগ্য অক্ষরের সাথে মেলে না। JavaScript স্ট্রিং টেক্সটের জন্য তৈরি; বাইনারি ডেটা ধরে রাখতে Node-এর একটি ভিন্ন টাইপ প্রয়োজন, আর এটিই একটি Buffer।
আসলে আপনি ইতিমধ্যে একটি তৈরি করেছেন, নাম না জেনেই। একটি ফাইল পড়ার সময় এনকোডিং বাদ দিন:
const fs = require('fs')
const data = fs.readFileSync('photo.png')
console.log(data) // <Buffer 89 50 4e 47 0d 0a 1a 0a ...>দ্বিতীয় আর্গুমেন্ট হিসেবে 'utf8' ছাড়া, readFileSync সেগুলোকে টেক্সট হিসেবে ডিকোড করার চেষ্টা না করে ফাইলের কাঁচা বাইট একটি Buffer হিসেবে ফেরত দেয় — এখানে উপযুক্ত, কারণ PNG ডেটা মোটেও অক্ষর হিসেবে পড়ার উদ্দেশ্যে নয়।
const buf = Buffer.from('Hello')
console.log(buf) // <Buffer 48 65 6c 6c 6f>
console.log(buf.length) // 5
console.log(buf.toString()) // 'Hello'Buffer.from() একটি স্ট্রিংকে এর কাঁচা বাইট রিপ্রেজেন্টেশনে রূপান্তর করে; .toString() এটি ফিরিয়ে আনে। একটি Buffer লগ করলে প্রতিটি বাইট hexadecimal-এ দেখানো হয়।
স্ট্রিম পাঠের 'data' ইভেন্ট ডিফল্টভাবে প্রতিটি chunk একটি Buffer হিসেবে দেয় — এটিই আসল টাইপ যা readStream.pipe(writeStream)-এর মধ্য দিয়ে প্রবাহিত হয়। স্ট্রিম পাঠের মতো createReadStream()-এ একটি এনকোডিং হিসেবে 'utf8' পাস করলে, আপনার 'data' হ্যান্ডলার এটি দেখার আগেই Node প্রতিটি chunk-কে একটি স্ট্রিং-এ রূপান্তর করতে বলে।
সাধারণ অ্যাপ্লিকেশন কোডে আপনি খুব একটা সরাসরি Buffer তৈরি করবেন না — বেশিরভাগ সময় সেগুলো আপনার কাছে ইতিমধ্যে হাতে দেওয়া অবস্থায় আসে, একটি ফাইল read, একটি নেটওয়ার্ক রেসপন্স, অথবা একটি স্ট্রিমের 'data' ইভেন্ট থেকে। এগুলো কী তা জানাটাই গুরুত্বপূর্ণ, যাতে আপনার কনসোল আউটপুটে একটি <Buffer ...> দেখা গেলে সেটি রহস্যময় মনে না হয়।