Java NIO (New I/O) এর Channels হলো এমন একটি উপাদান যা ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়। Channel এর মাধ্যমে ডেটা দ্রুত এবং কার্যকরভাবে Buffer তে পাঠানো হয় এবং পড়া হয়, যা I/O অপারেশনকে ব্লকিং বা সিঙ্ক্রোনাস অপারেশন থেকে নন-ব্লকিং অপারেশনে রূপান্তরিত করে।
NIO তে Channels এবং Buffers একসাথে কাজ করে, যেখানে Channels ডেটাকে Buffers এর মাধ্যমে প্রক্রিয়া করে। Channels এর মাধ্যমে ডেটা পাঠানোর এবং গ্রহণ করার কাজটি খুবই সহজ এবং দক্ষ।
এই লেখায়, Channels এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করার প্রক্রিয়া এবং এর উদাহরণ আলোচনা করা হবে।
Channels কি?
Channel একটি নন-ব্লকিং I/O উপাদান যা ডেটা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়। Channels এর দুটি প্রধান ধরনের রয়েছে:
- ReadableChannel: ডেটা পড়ার জন্য ব্যবহৃত চ্যানেল (যেমন FileChannel, SocketChannel)।
- WritableChannel: ডেটা লেখার জন্য ব্যবহৃত চ্যানেল (যেমন FileChannel, SocketChannel)।
- ByteChannel: এটি একটি সাধারণ চ্যানেল যা byte আকারে ডেটা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়।
Channels মূলত Buffer ব্যবহার করে ডেটা পাঠানোর এবং গ্রহণের কাজ সম্পাদন করে। Channels অবজেক্টের মাধ্যমে, আপনি I/O অপারেশনগুলিকে একাধিক চ্যানেল বা ফাইলের উপর কার্যকরভাবে পরিচালনা করতে পারেন।
Channels এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা
Java NIO তে Channels এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা দুটি প্রধান উপায়ে করা হয়:
- FileChannel: এটি ফাইলের মধ্যে ডেটা পাঠানোর এবং গ্রহণ করার জন্য ব্যবহৃত হয়।
- SocketChannel: এটি নেটওয়ার্কে ডেটা পাঠানোর এবং গ্রহণ করার জন্য ব্যবহৃত হয়।
এখানে FileChannel এবং SocketChannel এর মাধ্যমে ডেটা পাঠানোর এবং গ্রহণ করার উদাহরণ দেখানো হবে।
১. FileChannel এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা
FileChannel একটি চ্যানেল যা ফাইল থেকে ডেটা পাঠানোর এবং গ্রহণ করার জন্য ব্যবহৃত হয়। এটি FileInputStream এবং FileOutputStream এর মতো স্ট্রিমের তুলনায় অনেক বেশি দক্ষ।
উদাহরণ: FileChannel দিয়ে ডেটা পাঠানো (Write)
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
public class FileChannelWriteExample {
public static void main(String[] args) throws Exception {
// FileChannel তৈরি
RandomAccessFile file = new RandomAccessFile("output.txt", "rw");
FileChannel channel = file.getChannel();
// ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(48);
String message = "Hello, Java NIO!";
// ডেটা লিখুন
buffer.clear();
buffer.put(message.getBytes());
buffer.flip(); // Flip to read from buffer
while (buffer.hasRemaining()) {
channel.write(buffer); // FileChannel এ ডেটা লিখুন
}
file.close();
}
}
এখানে, আমরা FileChannel এর মাধ্যমে একটি ফাইলে ডেটা লিখছি। প্রথমে ByteBuffer তে ডেটা রাখা হচ্ছে এবং পরে সেই ডেটা FileChannel.write() মেথডের মাধ্যমে ফাইলে লেখা হচ্ছে।
উদাহরণ: FileChannel দিয়ে ডেটা গ্রহণ (Read)
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;
public class FileChannelReadExample {
public static void main(String[] args) throws Exception {
// FileChannel তৈরি
RandomAccessFile file = new RandomAccessFile("output.txt", "r");
FileChannel channel = file.getChannel();
// ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(48);
// ডেটা পড়ুন
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip(); // Flip to read from buffer
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = channel.read(buffer); // পুনরায় পড়ার জন্য চেক করুন
}
file.close();
}
}
এখানে, FileChannel ব্যবহার করে একটি ফাইল থেকে ডেটা পড়া হচ্ছে। ByteBuffer তে ডেটা পড়া হচ্ছে এবং তারপর তা আউটপুট হিসাবে প্রদর্শিত হচ্ছে।
২. SocketChannel এর মাধ্যমে নেটওয়ার্কে ডেটা পাঠানো এবং গ্রহণ করা
SocketChannel হল একটি চ্যানেল যা নেটওয়ার্কের মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়। এটি TCP/IP বা UDP সিপি-এর মাধ্যমে যোগাযোগের জন্য ব্যবহৃত হয়।
উদাহরণ: SocketChannel দিয়ে ডেটা পাঠানো (Write)
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class SocketChannelWriteExample {
public static void main(String[] args) throws Exception {
// SocketChannel তৈরি এবং সার্ভারে সংযোগ
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
// ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(48);
String message = "Hello from Java NIO Server!";
buffer.clear();
buffer.put(message.getBytes());
buffer.flip();
// ডেটা পাঠান
while (buffer.hasRemaining()) {
socketChannel.write(buffer);
}
socketChannel.close();
}
}
এখানে, SocketChannel ব্যবহার করে আমরা একটি সার্ভারে সংযোগ স্থাপন করছি এবং তারপর একটি বার্তা পাঠাচ্ছি। ByteBuffer তে ডেটা রাখা হচ্ছে এবং তারপর SocketChannel.write() মেথডের মাধ্যমে সার্ভারে পাঠানো হচ্ছে।
উদাহরণ: SocketChannel দিয়ে ডেটা গ্রহণ (Read)
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class SocketChannelReadExample {
public static void main(String[] args) throws Exception {
// SocketChannel তৈরি এবং সার্ভারে সংযোগ
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("localhost", 8080));
// ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(48);
// ডেটা গ্রহণ
int bytesRead = socketChannel.read(buffer);
while (bytesRead != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = socketChannel.read(buffer);
}
socketChannel.close();
}
}
এখানে, SocketChannel ব্যবহার করে আমরা একটি সার্ভার থেকে ডেটা গ্রহণ করছি। ByteBuffer তে ডেটা পাঠানোর জন্য প্রস্তুত করা হয় এবং এরপর তা প্রদর্শিত হয়।
Java NIO তে Channels একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান, যা ডেটা পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়। FileChannel এবং SocketChannel এর মাধ্যমে আমরা ফাইল এবং নেটওয়ার্ক সিস্টেমে ডেটা পাঠাতে এবং গ্রহণ করতে পারি। Channels এর সাহায্যে আমরা NIO এর ব্লকিং মডেল থেকে বেরিয়ে দ্রুত এবং কার্যকরী নন-ব্লকিং I/O অপারেশন করতে সক্ষম হই, যা আমাদের অ্যাপ্লিকেশনকে আরও পারফরম্যান্ট এবং স্কেলেবল করে তোলে।
Read more