Java NIO (New I/O), Java 1.4 এ চালু হওয়া একটি API, যা পারফরম্যান্স ও সক্ষমতা উন্নত করতে এবং I/O অপারেশনগুলোকে আরও কার্যকরী ও নমনীয় করার জন্য ডিজাইন করা হয়েছে। NIO একটি non-blocking I/O মডেল ব্যবহার করে যা buffers, channels, এবং selectors নামক তিনটি প্রধান কম্পোনেন্টের উপর ভিত্তি করে কাজ করে।
Java NIO এর প্রধান কম্পোনেন্ট
- Buffers
- Channels
- Selectors
1. Buffers (বাফার)
Buffers হল Java NIO এর অন্যতম প্রধান কম্পোনেন্ট যা ডেটা সংরক্ষণ করে এবং channels এর মাধ্যমে ডেটা রিড বা রাইট করার জন্য ব্যবহৃত হয়। একটি buffer হল একটি container যা ডেটা ধারণ করতে পারে এবং যেখানে ডেটা এক্সেস করা হয়। বাফার সাধারণত primitive data types (যেমন byte, char, int, float, ইত্যাদি) ধারণ করতে সক্ষম।
Buffer এর বৈশিষ্ট্য:
- Capacity: বাফারের একটি নির্দিষ্ট আকার থাকে, যা তার ধারণ ক্ষমতা নির্ধারণ করে।
- Position: বাফারের মধ্যে যেখানে ডেটা পরবর্তী পড়া বা লেখার জন্য রাখা হবে তা নির্দেশ করে।
- Limit: বাফারের মধ্যে পড়ার বা লেখার জন্য শেষ সীমা নির্দেশ করে।
- Mark: একটি ঐচ্ছিক সূচক যা নির্দিষ্ট পজিশনে মার্ক করতে সাহায্য করে।
Buffer Types:
- ByteBuffer:
byteডেটা ধারণ করে। - CharBuffer:
charডেটা ধারণ করে। - IntBuffer:
intডেটা ধারণ করে। - FloatBuffer:
floatডেটা ধারণ করে।
Buffer এর উদাহরণ:
import java.nio.ByteBuffer;
public class BufferExample {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put((byte) 1);
buffer.put((byte) 2);
buffer.flip(); // Position reset to 0, limit set to current position
// Reading from buffer
while (buffer.hasRemaining()) {
System.out.println(buffer.get()); // Output: 1 2
}
}
}
2. Channels (চ্যানেল)
Channels হল NIO এর দ্বিতীয় প্রধান কম্পোনেন্ট যা data transfer এর মাধ্যমে I/O অপারেশন সম্পন্ন করে। চ্যানেলগুলো ডেটাকে সরাসরি buffers থেকে I/O devices (যেমন ফাইল, নেটওয়ার্ক সোকেট) তে পাঠায় বা সেখান থেকে পড়ে।
Channels এর বৈশিষ্ট্য:
- FileChannel: ফাইলের মধ্যে ডেটা পড়তে এবং লিখতে ব্যবহৃত হয়।
- SocketChannel: নেটওয়ার্ক সোকেটের মাধ্যমে ডেটা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়।
- DatagramChannel: UDP (User Datagram Protocol) চ্যানেল হিসেবে ব্যবহৃত হয়।
- PipeChannel: পিপড স্ট্রিমের মাধ্যমে ডেটা এক্সচেঞ্জ করার জন্য ব্যবহৃত হয়।
Channel এর উদাহরণ:
import java.nio.channels.FileChannel;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
public class ChannelExample {
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("input.txt");
FileChannel channel = fileInputStream.getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear();
bytesRead = channel.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
FileChannelব্যবহার করে একটি ফাইল থেকে ডেটা পড়া হচ্ছে।ByteBufferব্যবহার করে চ্যানেল থেকে ডেটা ক্যাচ করা হচ্ছে এবং সেই ডেটা আউটপুটে প্রিন্ট করা হচ্ছে।
3. Selectors (সিলেক্টর)
Selectors হল Java NIO এর একটি বিশেষ কম্পোনেন্ট যা non-blocking I/O অপারেশনগুলোকে পরিচালনা করার জন্য ব্যবহৃত হয়। এটি এক বা একাধিক চ্যানেলের উপর নজর রাখে এবং যদি কোন চ্যানেলে I/O অপারেশন করার জন্য ডেটা প্রস্তুত থাকে তবে তা সক্রিয় করে।
Selectors এর বৈশিষ্ট্য:
- Multiplexing: একাধিক চ্যানেলের উপর নজর রেখে, যখন কোন চ্যানেলে ডেটা পড়তে বা লেখার জন্য প্রস্তুত থাকে তখন শুধুমাত্র সেই চ্যানেলে কাজ করা হয়।
- Non-blocking I/O: I/O অপারেশনগুলো ব্লক না করে কার্যকরী করা যায়।
Selector এর উদাহরণ:
import java.nio.channels.*;
import java.nio.*;
import java.net.*;
import java.io.IOException;
public class SelectorExample {
public static void main(String[] args) {
try {
// Creating a Selector
Selector selector = Selector.open();
// Creating a ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false);
// Registering the channel with the selector for ACCEPT events
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// Selecting keys with events
if (selector.select() > 0) {
// Handle the selected keys
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
// Accept the connection
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
System.out.println("Accepted connection from " + client.getRemoteAddress());
client.close();
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে একটি ServerSocketChannel তৈরি করা হয়েছে যা একটি পোর্টে listening করবে।
- Selector ব্যবহার করে আমরা চেক করছি যে চ্যানেলে accept অপারেশনটি করা যাবে কিনা, এবং client থেকে কনেকশন গ্রহণ করছি।
Java NIO এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- High Performance: Java NIO non-blocking I/O অপারেশনগুলির মাধ্যমে দ্রুত ডেটা প্রসেসিং করতে সাহায্য করে।
- Scalability: একাধিক কানেকশন এবং I/O অপারেশনকে একসাথে পরিচালনা করার জন্য Selectors ব্যবহৃত হয়, যা স্কেলেবিলিটি বাড়ায়।
- Direct Buffer: NIO এর Direct Buffers মেমরি ব্যবস্থাপনা আরও উন্নত করে, কারণ এটি ডেটাকে ডিরেক্ট মেমরিতে সংরক্ষণ করে।
সীমাবদ্ধতা:
- Complexity: Java NIO এর কার্যকারিতা ও ব্যবহারের জন্য কিছুটা complexity থাকতে পারে।
- Blocking I/O: NIO সিস্টেম এখনও blocking I/O এর সমস্যা ধারণ করতে পারে, বিশেষ করে ডেটা নাও পাওয়া গেলে।
- Limited API: কিছু নির্দিষ্ট ধরনের I/O অপারেশন (যেমন, ফাইল অপারেশন) করার জন্য NIO এর API সীমিত থাকতে পারে।
- Java NIO একটি শক্তিশালী API যা Buffers, Channels, এবং Selectors এর মাধ্যমে non-blocking I/O সিস্টেমে কাজ করার জন্য ডিজাইন করা হয়েছে।
- NIO পারফরম্যান্স উন্নত করতে, multiple I/O operations একসাথে পরিচালনা করতে এবং high scalability প্রদান করতে সাহায্য করে।
- Java NIO ব্যবহার করে আপনি file I/O, network I/O, এবং buffer management এর কাজ সহজে এবং দ্রুত করতে পারবেন।
Read more