Java NIO (New Input/Output) একটি Java লাইব্রেরি যা Java SE 1.4 ভার্সনে পরিচিত হয় এবং এটি সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস I/O অপারেশনগুলির জন্য সমর্থন প্রদান করে। Java NIO মূলত I/O অপারেশনগুলি দ্রুততর এবং বেশি দক্ষ করতে ডিজাইন করা হয়েছে। এটি নন-ব্লকিং I/O, বাফারস, চ্যানেলস, এবং সিলেক্টরস এর মতো কনসেপ্ট ব্যবহার করে যেগুলি ট্রেডিশনাল Java I/O লাইব্রেরির তুলনায় অনেক বেশি ফ্লেক্সিবল এবং পারফরম্যান্স-বান্ধব।
Java NIO এর বৈশিষ্ট্য
- Non-blocking I/O (নন-ব্লকিং I/O): Java NIO এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হল নন-ব্লকিং I/O। এর মানে হল যে, যখন কোনো I/O অপারেশন (যেমন ফাইল রিড বা রাইট) সম্পন্ন হওয়ার জন্য অপেক্ষা করতে হয়, তখন থ্রেড ব্লক হয়ে যায় না, বরং অন্য কাজ করতে থাকে। এটি অ্যাসিঙ্ক্রোনাস অপারেশন এবং মাল্টি-থ্রেডিং অ্যাপ্লিকেশনে বিশেষভাবে কার্যকরী।
- Buffers (বাফারস): Java NIO তে ডেটা পরিচালনা করার জন্য Buffer ব্যবহার করা হয়। এটি একটি পদ্ধতি যেখানে ডেটা মেমোরিতে নির্দিষ্ট স্থানে (বাফারে) পড়া বা লেখা হয়। এর ফলে ডেটা স্ট্রিমে পরিচালনা করা দ্রুত এবং দক্ষ হয়।
- Channels (চ্যানেলস): Channels হল Java NIO এর একটি কম্পোনেন্ট যা ডেটা পাঠানোর বা গ্রহণ করার জন্য ব্যবহৃত হয়। এটি Stream এর পরিবর্তে ব্যবহৃত হয় এবং এটি এক ধরনের bi-directional ডেটা ট্রান্সফার পাথওয়ে হিসেবে কাজ করে।
- Selectors (সিলেক্টরস): Java NIO তে Selectors একটি গুরুত্বপূর্ণ ফিচার। এটি একাধিক চ্যানেলকে মনিটর করার জন্য ব্যবহার করা হয়, যাতে কোনো চ্যানেলে কাজ করার সুযোগ থাকলে তাতে I/O অপারেশন করা যায়। এটি নন-ব্লকিং অপারেশন এর সাথে কাজ করে এবং একটি সিঙ্গেল থ্রেডকে একাধিক ক্লায়েন্ট বা চ্যানেলের সাথে কাজ করতে দেয়।
- Asynchronous I/O (অ্যাসিঙ্ক্রোনাস I/O): Java NIO অ্যাসিঙ্ক্রোনাস I/O এর জন্য AsynchronousFileChannel এবং AsynchronousSocketChannel প্রদান করে, যা থ্রেড ব্লক না করে I/O অপারেশন করতে সাহায্য করে। এটি রিয়েল-টাইম অ্যাপ্লিকেশন এবং নেটওয়ার্ক সার্ভিসে কার্যকর।
Java NIO এর ব্যবহার
১. নন-ব্লকিং চ্যানেলস (Non-blocking Channels)
Java NIO তে Non-blocking Channels ব্যবহার করে আপনি একাধিক I/O অপারেশন একসাথে করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে FileChannel এবং SocketChannel ব্যবহার করা হয়েছে:
import java.nio.channels.*;
import java.nio.*;
import java.net.*;
public class NonBlockingChannelExample {
public static void main(String[] args) throws Exception {
// Open a non-blocking channel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false); // Set non-blocking mode
// Bind to a port
serverSocketChannel.bind(new InetSocketAddress(5000));
// Use selector for managing multiple channels
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() > 0) {
// Handle ready channels
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
// Handle incoming connection
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = server.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
}
}
}
}
}
}
এখানে ServerSocketChannel এবং Selector ব্যবহার করে একাধিক ক্লায়েন্ট সংযোগের জন্য নন-ব্লকিং অপারেশন তৈরি করা হয়েছে।
২. ফাইল রিড এবং রাইট (File Read and Write)
Java NIO তে FileChannel ব্যবহার করে ফাইল রিড এবং রাইট করা যায়। এটি Buffer ব্যবহার করে দ্রুত I/O অপারেশন সম্পন্ন করতে সহায়ক।
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class FileReadWriteExample {
public static void main(String[] args) throws IOException {
// Open file channel for reading and writing
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel channel = file.getChannel();
// Write data to the file
ByteBuffer buffer = ByteBuffer.allocate(48);
String data = "Hello, Java NIO!";
buffer.clear();
buffer.put(data.getBytes());
buffer.flip();
while(buffer.hasRemaining()) {
channel.write(buffer);
}
// Read data from the file
buffer.clear();
channel.position(0);
channel.read(buffer);
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
}
}
এখানে FileChannel এবং ByteBuffer ব্যবহার করে ফাইল থেকে ডেটা পড়া এবং লেখা হয়েছে।
৩. Selectors এর ব্যবহার (Using Selectors)
Selectors ব্যবহার করে একাধিক চ্যানেলকে মনিটর করা যায়, যাতে একটি সিঙ্গেল থ্রেড একাধিক I/O অপারেশন পরিচালনা করতে পারে। এটি সিস্টেমের পারফরম্যান্স উন্নত করতে সহায়ক।
import java.nio.*;
import java.nio.channels.*;
import java.net.*;
import java.io.*;
public class SelectorExample {
public static void main(String[] args) throws IOException {
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(5000));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select() > 0) {
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
SocketChannel clientChannel = serverChannel.accept();
clientChannel.configureBlocking(false);
clientChannel.register(selector, SelectionKey.OP_READ);
}
}
}
}
}
}
এখানে Selector এবং ServerSocketChannel ব্যবহার করে একাধিক ক্লায়েন্ট সংযোগ পরিচালনা করা হয়েছে।
Java NIO (New Input/Output) একটি অত্যন্ত কার্যকরী এবং স্কেলেবল লাইব্রেরি যা সিঙ্ক্রোনাস এবং অ্যাসিঙ্ক্রোনাস I/O অপারেশন পরিচালনার জন্য ব্যবহৃত হয়। NIO-এর Non-blocking I/O, Buffers, Channels, এবং Selectors ফিচারগুলো পারফরম্যান্স এবং অ্যাসিঙ্ক্রোনাস অ্যাপ্লিকেশন নির্মাণে বিশেষভাবে সহায়ক। এটি ব্যবহারের মাধ্যমে মাল্টি-থ্রেডেড এবং নেটওয়ার্ক-বেসড অ্যাপ্লিকেশনগুলির পারফরম্যান্স অনেক বৃদ্ধি পায়।
Read more