Java NIO (New I/O) Java এর একটি শক্তিশালী API যা I/O অপারেশন আরও দ্রুত, দক্ষ এবং নমনীয়ভাবে পরিচালনা করার জন্য ডিজাইন করা হয়েছে। NIO একটি নতুন স্টাইলের I/O মডেল প্রদান করে, যা সিঙ্ক্রোনাস I/O এর তুলনায় অধিক পারফরম্যান্স প্রদান করে। NIO এর মধ্যে বিভিন্ন ক্লাস ও কনসেপ্ট রয়েছে, যার মধ্যে একটি গুরুত্বপূর্ণ কনসেপ্ট হল Channel।
Channel কি?
Channel হল Java NIO এর একটি ইন্টারফেস যা ডেটা ট্রান্সফার করার জন্য ব্যবহৃত হয়, অর্থাৎ এটি সোর্স এবং ডেস্টিনেশনের মধ্যে ডেটা পাঠানোর জন্য ব্যবহৃত হয়। Channel সরাসরি ডেটা পাঠানোর জন্য একটি খোলামেলা পোর্ট সরবরাহ করে, যেখানে ডেটা একটি স্ট্রিম আকারে পাঠানো বা গ্রহণ করা হয়।
Java NIO তে Channel এবং Stream এর মধ্যে পার্থক্য হল, যেখানে Stream একটি সরল ও সিকোয়েন্সিয়াল ডেটা প্রবাহ এবং Channel বেশ কিছু উন্নত ফিচার সরবরাহ করে, যেমন একাধিক I/O অপারেশন সমর্থন এবং Non-blocking I/O।
Channel এর বৈশিষ্ট্য:
- Bidirectional:
Channelডেটা পাঠানোর পাশাপাশি গ্রহণ করতে সক্ষম। - Non-blocking: Channel গুলি সাধারণত Non-blocking মোডে কাজ করে, অর্থাৎ ডেটা ট্রান্সফার করতে একটি থ্রেড অপেক্ষা না করে অন্য কাজ করতে পারে।
- Buffer ব্যবহার: Channel এর মাধ্যমে ডেটা পাঠানোর জন্য
Bufferব্যবহার করা হয়।
Channel এর ধরণ
Java NIO তে বিভিন্ন ধরনের Channel রয়েছে, যার মধ্যে কিছু গুরুত্বপূর্ণ হল:
- FileChannel: ফাইল থেকে ডেটা পড়া এবং ফাইলে ডেটা লেখা।
- DatagramChannel: UDP সোকেট যোগাযোগের জন্য ব্যবহৃত।
- SocketChannel: TCP সোকেটের মাধ্যমে I/O অপারেশন চালানো।
- ServerSocketChannel: TCP/IP সার্ভার অ্যাপ্লিকেশন পরিচালনা করা।
- SelectableChannel: Non-blocking I/O এর জন্য ব্যবহৃত।
Channel কিভাবে কাজ করে?
Channel গুলি মূলত Non-blocking I/O অপারেশন সমর্থন করে, যেখানে আপনি একাধিক I/O অপারেশন পরিচালনা করতে পারেন। Channel গুলির সাথে Selector এর ব্যবহার একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, কারণ এটি একাধিক Channel গুলির I/O অপারেশনকে একত্রিত করে পরিচালনা করতে সাহায্য করে। এটি একটি প্রধান কনসেপ্ট যা Multiplexing হিসেবে পরিচিত।
Channel এর মাধ্যমে ডেটা পাঠানো বা গ্রহণ করা
Java NIO তে Channel ব্যবহার করে ডেটা ট্রান্সফার করার জন্য, ডেটা পাঠানোর জন্য একটি Buffer এবং ডেটা গ্রহণের জন্য আরেকটি Buffer ব্যবহার করা হয়।
উদাহরণ: FileChannel ব্যবহার করে ফাইল থেকে ডেটা পড়া:
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelExample {
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("input.txt");
FileChannel fileChannel = fileInputStream.getChannel()) {
// Buffer তৈরি করা
ByteBuffer buffer = ByteBuffer.allocate(1024);
// FileChannel থেকে ডেটা পড়া
while (fileChannel.read(buffer) > 0) {
buffer.flip(); // Buffer প্রস্তুত করা পড়া ডেটা দিয়ে
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get()); // ডেটা আউটপুট করা
}
buffer.clear(); // Buffer পুনরায় ব্যবহারযোগ্য করে তোলা
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, FileChannel ব্যবহার করে ফাইল থেকে ডেটা পড়া হচ্ছে। ByteBuffer ব্যবহার করে ডেটা স্টোর করা হচ্ছে, এবং flip(), clear() মেথডগুলি বাফারের স্টেট ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।
Non-blocking Mode এর উদাহরণ
Java NIO তে Channel গুলি সাধারণত Non-blocking মোডে কাজ করে, যেখানে আপনি I/O অপারেশন সম্পাদন করার জন্য অপেক্ষা না করে অন্য কাজ করতে পারেন। এটি অনেক বেশি পারফরম্যান্স এবং কার্যকারিতা প্রদান করে।
import java.nio.channels.SocketChannel;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
public class NonBlockingChannelExample {
public static void main(String[] args) {
try {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false); // Non-blocking মোডে সেট করা
socketChannel.connect(new InetSocketAddress("localhost", 8080));
while (!socketChannel.finishConnect()) {
// কানেকশন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করা
System.out.println("Connecting...");
}
String message = "Hello, Server!";
ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
socketChannel.write(buffer); // সোকেট চ্যানেলে ডেটা লেখা
socketChannel.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, SocketChannel একটি Non-blocking মোডে কনফিগার করা হয়েছে, যার মাধ্যমে সিস্টেম ব্লক না হয়ে অন্য কাজ করতে পারে।
Channel এর সাথে Selector ব্যবহার
Selector একটি গুরুত্বপূর্ণ কনসেপ্ট যা Java NIO তে একাধিক SelectableChannel এর I/O অপারেশনকে একত্রিত করে পরিচালনা করতে সাহায্য করে। এটি ব্যবহৃত হয় Multiplexing এর জন্য, যেখানে একাধিক সোকেট বা অন্যান্য চ্যানেলের উপর একসাথে I/O অপারেশন পরিচালনা করা যায়।
উদাহরণ:
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.channels.SelectionKey;
import java.net.InetSocketAddress;
public class SelectorExample {
public static void main(String[] args) {
try {
Selector selector = Selector.open();
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("localhost", 8080));
socketChannel.register(selector, SelectionKey.OP_CONNECT);
while (true) {
if (selector.select() > 0) {
// Select করেছে, তখন কার্যকলাপ করা যায়
for (SelectionKey key : selector.selectedKeys()) {
if (key.isConnectable()) {
socketChannel.finishConnect();
System.out.println("Connected to server");
}
}
selector.selectedKeys().clear();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে, Selector ব্যবহার করে একাধিক চ্যানেল থেকে নির্বাচন করা হয়েছে এবং I/O অপারেশন পরিচালনা করা হয়েছে।
Java NIO তে Channel একটি গুরুত্বপূর্ণ উপাদান যা ডেটা পাঠানো এবং গ্রহণের জন্য ব্যবহৃত হয়। এটি বিভিন্ন ধরনের চ্যানেল যেমন FileChannel, SocketChannel, DatagramChannel, এবং ServerSocketChannel সমর্থন করে। Channel গুলি মূলত Non-blocking I/O সিস্টেমের অংশ হিসেবে কাজ করে এবং Java NIO তে ডেটা ট্রান্সফার করার জন্য Buffer ব্যবহৃত হয়। Selector এর সাথে Channel গুলি একত্রিত হয়ে Multiplexing এর সুবিধা প্রদান করে, যা একাধিক I/O অপারেশন পরিচালনা করতে সাহায্য করে এবং সিস্টেমের পারফরম্যান্স উন্নত করে।