Java NIO (New I/O) একটি উন্নত ইনপুট/আউটপুট লাইব্রেরি যা ব্লকিং এবং নন-ব্লকিং I/O অপারেশন পরিচালনা করতে সহায়ক। NIO এর অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য হল Scatter এবং Gather অপারেশনগুলি। এই দুটি প্রযুক্তি বড় ডেটা সেটের জন্য কার্যকর এবং পারফরম্যান্সের উন্নতি সাধন করতে সাহায্য করে, বিশেষত যখন ডেটা একাধিক বাফারে বিতরণ বা একত্রিত করার প্রয়োজন হয়।
Scatter এবং Gather অপারেশনগুলি ByteBuffer এর সাথে কাজ করে এবং এটি বিশেষভাবে ফাইল I/O বা নেটওয়ার্ক ট্রান্সফারের জন্য ব্যবহার করা হয় যেখানে ডেটার বিভিন্ন অংশ একাধিক বাফারে সংরক্ষণ বা একত্রিত করা হয়।
Scatter এর ধারণা
Scatter অপারেশন হল একটি প্রক্রিয়া যেখানে ডেটা একাধিক বাফারে (buffers) লেখা হয়। সাধারনত, ডেটা এক জায়গা থেকে অন্য জায়গায় পাঠানো হলে, তা একাধিক বাফারে ভাগ করা হয়। Scatter অপারেশনটি নেটওয়ার্ক বা ফাইল I/O-তে ব্যবহৃত হয়, যখন আপনি একাধিক অংশে ডেটা পড়তে চান।
Scatter এর কাজ
Scatter অপারেশন সাধারণত একটি Readable Channel (যেমন, SocketChannel, FileChannel) থেকে ডেটা পড়তে ব্যবহৃত হয়। এখানে, ByteBuffer এর একটি অ্যারে বা একাধিক বাফারে ডেটা একত্রিত করা হয়। উদাহরণস্বরূপ, যখন একটি ফাইলের বিভিন্ন অংশ থেকে ডেটা পড়া হয় এবং তা একাধিক বাফারে ভেঙে রাখা হয়, তখন এই প্রযুক্তি ব্যবহৃত হয়।
ByteBuffer buffer1 = ByteBuffer.allocate(1024);
ByteBuffer buffer2 = ByteBuffer.allocate(1024);
ByteBuffer[] buffers = { buffer1, buffer2 };
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));
socketChannel.read(buffers); // Scatter: Read data into multiple buffers
এখানে, SocketChannel থেকে ডেটা দুটি বাফারে বিতরণ (scatter) করা হচ্ছে। যখন ডেটা একাধিক বাফারে বিতরণ করা হয়, তখন একাধিক ByteBuffer ব্যবহার করা হয় যা ডেটার বিভিন্ন অংশ ধারণ করে।
Scatter এর সুবিধা
- বড় ডেটা সেটের কার্যকরী পরিচালনা: একাধিক বাফারে ডেটা পড়ার মাধ্যমে বড় ডেটা সেটগুলি ছোট অংশে বিভক্ত হয়ে সহজে পরিচালনা করা যায়।
- কম রিসোর্স ব্যবহার: বিভিন্ন বাফারে ডেটা সংরক্ষণ করে, সিস্টেম রিসোর্সের ব্যবহারের দক্ষতা বাড়ানো যায়।
Gather এর ধারণা
Gather অপারেশনটি Scatter এর বিপরীত কাজ করে। এখানে একাধিক বাফারের মধ্যে থাকা ডেটা একত্রিত (gather) হয়ে একটি নির্দিষ্ট Writable Channel (যেমন, SocketChannel, FileChannel) এ লেখা হয়। এটি তখন ব্যবহার করা হয় যখন একাধিক বাফারের মধ্যে ডেটা একত্রিত করে একটি চ্যানেলে লেখা হয়।
Gather এর কাজ
Gather অপারেশনটি একটি Writable Channel এ ডেটা লেখার জন্য ব্যবহৃত হয়, যেখানে ডেটা একাধিক বাফারের মধ্যে উপস্থিত থাকে। এটি যখন ব্যবহার করা হয়, তখন একাধিক বাফারের ডেটা একত্রিত হয়ে একটি চ্যানেলে লেখা হয়।
ByteBuffer buffer1 = ByteBuffer.allocate(1024);
ByteBuffer buffer2 = ByteBuffer.allocate(1024);
ByteBuffer[] buffers = { buffer1, buffer2 };
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));
socketChannel.write(buffers); // Gather: Write data from multiple buffers to channel
এখানে, দুটি বাফারের মধ্যে থাকা ডেটা SocketChannel এ একত্রিত (gather) হয়ে লেখা হচ্ছে। যখন একাধিক বাফারে ডেটা থাকে এবং সেগুলিকে একযোগে একটি চ্যানেলে লেখা হয়, তখন gather অপারেশন ব্যবহৃত হয়।
Gather এর সুবিধা
- ডেটা একত্রিত করা সহজ: একাধিক বাফারের ডেটাকে একত্রিত করে একটি চ্যানেলে পাঠানো সম্ভব হয়, যা অ্যাপ্লিকেশনকে আরও কার্যকরী এবং পারফরম্যান্স সমর্থনশীল করে তোলে।
- কম্প্যাক্ট ডেটা ট্রান্সফার: একাধিক বাফার থেকে ডেটা সংগ্রহ করে, নেটওয়ার্ক বা ফাইলের মধ্যে একত্রে ডেটা পাঠানো যায়, যা অপটিমাইজড ডেটা ট্রান্সফার নিশ্চিত করে।
Scatter এবং Gather এর বাস্তব উদাহরণ
ধরা যাক, একটি সার্ভার-ক্লায়েন্ট অ্যাপ্লিকেশন তৈরি করা হচ্ছে যেখানে সার্ভার ক্লায়েন্ট থেকে ডেটা গ্রহণ করবে (Scatter), এবং ক্লায়েন্ট সার্ভারে ডেটা পাঠাবে (Gather)। এই ক্ষেত্রে ByteBuffer[] ব্যবহার করে ডেটা একাধিক বাফারে পড়া এবং লেখা হয়।
Scatter Example: ক্লায়েন্ট থেকে সার্ভারে ডেটা পাঠানো
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
import java.net.*;
public class ScatterExample {
public static void main(String[] args) throws IOException {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));
ByteBuffer buffer1 = ByteBuffer.allocate(256);
ByteBuffer buffer2 = ByteBuffer.allocate(256);
ByteBuffer[] buffers = { buffer1, buffer2 };
// Scatter: Read data into multiple buffers
socketChannel.read(buffers);
System.out.println("Buffer1: " + new String(buffer1.array()));
System.out.println("Buffer2: " + new String(buffer2.array()));
}
}
Gather Example: সার্ভারে একত্রিত ডেটা লেখা
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
import java.net.*;
public class GatherExample {
public static void main(String[] args) throws IOException {
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("localhost", 8080));
ByteBuffer buffer1 = ByteBuffer.wrap("Hello, ".getBytes());
ByteBuffer buffer2 = ByteBuffer.wrap("World!".getBytes());
ByteBuffer[] buffers = { buffer1, buffer2 };
// Gather: Write data from multiple buffers to the channel
socketChannel.write(buffers);
System.out.println("Data sent to server.");
}
}
Scatter এবং Gather অপারেশন Java NIO-এর দুটি অত্যন্ত কার্যকরী বৈশিষ্ট্য যা বড় ডেটা সেটের সাথে কাজ করার সময় পারফরম্যান্স উন্নত করতে সাহায্য করে। Scatter অপারেশনটি একাধিক বাফারে ডেটা পড়তে ব্যবহৃত হয়, এবং Gather অপারেশনটি একাধিক বাফার থেকে ডেটা একত্রিত করে চ্যানেলে লেখে। এই দুটি প্রযুক্তি বৃহৎ ডেটা সেটের সঠিকভাবে এবং দক্ষভাবে পরিচালনা করতে সহায়ক, এবং Java NIO এর মাধ্যমে উন্নত I/O পারফরম্যান্স নিশ্চিত করে।
Read more