Java NIO (New Input/Output) ব্যবহার করে একাধিক বাফারের (Multiple Buffers) মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা একটি শক্তিশালী কৌশল, বিশেষ করে যখন আপনাকে বড় ডেটাসেট প্রক্রিয়াকরণ বা একাধিক ডেটা স্ট্রিমের মাধ্যমে ডেটা পাঠাতে/গ্রহণ করতে হয়। Java NIO তে একাধিক বাফার ব্যবহার করে একাধিক চ্যানেল বা সোর্স থেকে ডেটা পাঠানো এবং গ্রহণ করার প্রক্রিয়াটি দ্রুত এবং কার্যকর হতে পারে, কারণ আপনি একাধিক বাফারের মধ্যে ডেটা শেয়ার করতে পারেন এবং একাধিক I/O অপারেশন একসাথে চালাতে পারেন।
এখানে, আমরা Multiple Buffers ব্যবহার করে ডেটা পাঠানো এবং গ্রহণ করার কিছু কৌশল এবং উদাহরণ দেখবো।
Multiple Buffers এর মাধ্যমে Data পাঠানো এবং গ্রহণ করা
Java NIO তে Multiple Buffers ব্যবহার করার সময় সাধারণত ByteBuffer বা অন্যান্য Buffer ক্লাস ব্যবহার করা হয়, এবং একাধিক বাফারকে একসাথে ব্যবস্থাপনা করা হয়। একাধিক বাফার ব্যবহার করে নন-ব্লকিং I/O বা বিভিন্ন চ্যানেলের মধ্যে ডেটা প্রক্রিয়া করতে সাহায্য হয়।
১. একাধিক বাফার তৈরি করা
Java NIO তে একাধিক বাফার তৈরি করা সহজ। আমরা একাধিক ByteBuffer তৈরি করতে পারি এবং তাদের মধ্যে ডেটা রাখতে পারি। উদাহরণস্বরূপ, এখানে দুইটি বাফার তৈরি করা হয়েছে:
import java.nio.ByteBuffer;
public class MultipleBuffersExample {
public static void main(String[] args) {
// Create two buffers with a capacity of 10 bytes each
ByteBuffer buffer1 = ByteBuffer.allocate(10);
ByteBuffer buffer2 = ByteBuffer.allocate(10);
// Putting some data in the first buffer
buffer1.put((byte) 1);
buffer1.put((byte) 2);
// Putting some data in the second buffer
buffer2.put((byte) 3);
buffer2.put((byte) 4);
// Print the buffers
System.out.println("Buffer1: " + buffer1);
System.out.println("Buffer2: " + buffer2);
}
}
এখানে, দুটি ByteBuffer তৈরি করা হয়েছে, যেখানে buffer1 এবং buffer2 তে কিছু ডেটা ইনসার্ট করা হয়েছে।
২. Multiple Buffers এর মাধ্যমে Data পাঠানো
এখন একাধিক বাফারের মাধ্যমে ডেটা পাঠানোর উদাহরণ দেখা যাক। এখানে, আমরা FileChannel ব্যবহার করে একাধিক বাফারে ডেটা পাঠাচ্ছি:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class MultipleBuffersWriteExample {
public static void main(String[] args) throws IOException {
// Create two buffers with 10 bytes capacity each
ByteBuffer buffer1 = ByteBuffer.allocate(10);
ByteBuffer buffer2 = ByteBuffer.allocate(10);
// Fill buffer1 and buffer2 with some data
buffer1.put("Hello".getBytes());
buffer2.put("World".getBytes());
// Flip buffers to prepare them for writing
buffer1.flip();
buffer2.flip();
// Create a FileChannel to write the data
FileOutputStream fos = new FileOutputStream("output.txt");
FileChannel channel = fos.getChannel();
// Write data from both buffers into the file
channel.write(buffer1);
channel.write(buffer2);
// Close the channel and stream
fos.close();
System.out.println("Data written to file.");
}
}
এখানে, আমরা দুটি বাফার তৈরি করেছি এবং তাদের মধ্যে ডেটা রেখেছি। এরপর, আমরা FileChannel ব্যবহার করে এই বাফারের ডেটা ফাইলে লিখেছি। buffer1.flip() এবং buffer2.flip() ব্যবহার করা হয়েছে যাতে বাফারগুলিকে রিডি করা যায় ডেটা লেখার জন্য।
৩. Multiple Buffers এর মাধ্যমে Data গ্রহণ করা
এখন একাধিক বাফারের মাধ্যমে ডেটা গ্রহণ করার উদাহরণ দেখব। আমরা FileChannel ব্যবহার করে দুটি বাফারে ডেটা পড়ছি:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class MultipleBuffersReadExample {
public static void main(String[] args) throws IOException {
// Create two buffers with 10 bytes capacity each
ByteBuffer buffer1 = ByteBuffer.allocate(10);
ByteBuffer buffer2 = ByteBuffer.allocate(10);
// Open the file channel for reading
FileInputStream fis = new FileInputStream("output.txt");
FileChannel channel = fis.getChannel();
// Read data from the channel into both buffers
channel.read(buffer1);
channel.read(buffer2);
// Flip the buffers for reading
buffer1.flip();
buffer2.flip();
// Print the data in buffers
System.out.println("Buffer1 data: " + new String(buffer1.array(), 0, buffer1.limit()));
System.out.println("Buffer2 data: " + new String(buffer2.array(), 0, buffer2.limit()));
// Close the file channel and stream
fis.close();
}
}
এখানে, FileChannel.read() ব্যবহার করে দুটি বাফারে ডেটা পড়া হচ্ছে। buffer1.flip() এবং buffer2.flip() ব্যবহার করা হয়েছে যাতে বাফারগুলির মধ্যে ডেটা রিড করা যায়। এরপর, buffer1 এবং buffer2 থেকে ডেটা পড়া হচ্ছে এবং প্রিন্ট করা হচ্ছে।
৪. Multiple Buffers ব্যবহার করে Non-blocking I/O
Java NIO তে Multiple Buffers ব্যবহার করে নন-ব্লকিং I/O অপারেশন করা যেতে পারে, যা একাধিক চ্যানেলের উপর ডেটা পাঠানো বা গ্রহণ করা সম্ভব করে। Selector এবং Channel ব্যবহার করে আপনি একাধিক চ্যানেলের মধ্যে ডেটা পাঠাতে এবং গ্রহণ করতে পারেন।
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
import java.net.*;
public class NonBlockingMultipleBuffersExample {
public static void main(String[] args) throws IOException {
// Open a server socket
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
// Create selectors and buffers
Selector selector = Selector.open();
ByteBuffer buffer1 = ByteBuffer.allocate(1024);
ByteBuffer buffer2 = ByteBuffer.allocate(1024);
// Register the server socket channel with the selector
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
// Select the key for an incoming connection
while (true) {
selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if (key.isAcceptable()) {
// Accept the connection
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// Read data from the client using multiple buffers
SocketChannel socketChannel = (SocketChannel) key.channel();
socketChannel.read(buffer1);
socketChannel.read(buffer2);
buffer1.flip();
buffer2.flip();
// Print the data from buffers
System.out.println("Data from buffer1: " + new String(buffer1.array(), 0, buffer1.limit()));
System.out.println("Data from buffer2: " + new String(buffer2.array(), 0, buffer2.limit()));
buffer1.clear();
buffer2.clear();
}
}
}
}
}
এখানে, ServerSocketChannel এবং Selector ব্যবহার করে নন-ব্লকিং সেকেন্ডারি I/O পরিচালনা করা হচ্ছে, এবং Multiple Buffers দিয়ে একাধিক চ্যানেল থেকে ডেটা গ্রহণ করা হচ্ছে।
Java NIO তে Multiple Buffers ব্যবহার করে ডেটা পাঠানো এবং গ্রহণ করা একটি শক্তিশালী কৌশল যা বিশেষত বড় ডেটাসেট এবং একাধিক ডেটা স্ট্রিম পরিচালনা করার জন্য অত্যন্ত কার্যকর। ByteBuffer ব্যবহার করে একাধিক বাফারে ডেটা পাঠানো এবং গ্রহণ করা সহজ এবং দ্রুত হয়, এবং নন-ব্লকিং I/O এর মাধ্যমে বিভিন্ন চ্যানেল থেকে ডেটা পাঠানো বা গ্রহণ করা সম্ভব হয়।
Java NIO এর এই ক্ষমতা আপনাকে উচ্চ কার্যক্ষমতা সম্পন্ন অ্যাপ্লিকেশন তৈরি করতে সহায়তা করবে, যেখানে একাধিক ডেটা স্ট্রিম একই সময়ে পরিচালনা করতে হয়।