Java NIO (New Input/Output), Java 1.4 এ পরিচিত হয় এবং এটি Java I/O (Input/Output) এর পরবর্তী প্রজন্ম। NIO এর প্রধান উদ্দেশ্য হল I/O অপারেশনগুলিকে দ্রুততর করা এবং non-blocking I/O সক্ষম করা। Java NIO ব্যবহার করে আপনি high-performance I/O অপারেশন সম্পাদন করতে পারবেন, যা blocking I/O এর তুলনায় অনেক বেশি কার্যকর।
Java NIO এর মূল বৈশিষ্ট্য:
- Non-blocking I/O:
- NIO এর একটি প্রধান বৈশিষ্ট্য হল non-blocking I/O। যেখানে traditional I/O থ্রেডকে ব্লক করে রেখে অপেক্ষা করতে হয়, NIO পদ্ধতিতে আপনি একাধিক I/O অপারেশনকে একসাথে পরিচালনা করতে পারেন, এবং থ্রেড ব্লক করা হয় না। Selector এবং Channel এর মাধ্যমে এটি সম্ভব হয়।
- Buffer:
- Java NIO-তে ডেটা Buffer এর মাধ্যমে পরিচালিত হয়। Buffer হলো একটি মেমরি ব্লক যেখানে ডেটা লেখার বা পড়ার জন্য সংরক্ষিত হয়।
ByteBuffer,CharBuffer,IntBufferইত্যাদি হল বিভিন্ন ধরনের বাফার যা আপনি NIO এর মাধ্যমে ব্যবহার করতে পারেন।
- Java NIO-তে ডেটা Buffer এর মাধ্যমে পরিচালিত হয়। Buffer হলো একটি মেমরি ব্লক যেখানে ডেটা লেখার বা পড়ার জন্য সংরক্ষিত হয়।
- Channels:
- Channels হল NIO এর প্রধান অবজেক্ট যা ডেটা পাঠানোর বা গ্রহণ করার জন্য ব্যবহৃত হয়। FileChannel, SocketChannel, এবং DatagramChannel এর মতো বিভিন্ন ধরনের চ্যানেল রয়েছে। চ্যানেলগুলি buffer এর মাধ্যমে ডেটা পড়ে বা লেখে।
- Selectors:
- Selectors ব্যবহার করে non-blocking I/O এর মাধ্যমে একাধিক চ্যানেলকে মনিটর করা যায়। এটি single-threaded মাধ্যমে একাধিক channels এর I/O অপারেশন পরিচালনা করার সুযোগ প্রদান করে। এটি প্যারালাল I/O অপারেশন সহজ করে তোলে, কারণ একাধিক I/O অপারেশন একসাথে চলতে পারে এবং একটি থ্রেড ব্লক হয় না।
- Scattering and Gathering:
- Scattering এবং Gathering NIO এর দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য। Scattering হল একটি single read অপারেশন দ্বারা একাধিক বাফারে ডেটা পড়া, এবং Gathering হল একাধিক বাফার থেকে single write অপারেশন দ্বারা ডেটা লেখা।
Java NIO এর প্রধান কম্পোনেন্ট:
- Buffer:
- Buffer হল মেমরি ব্লক যেখানে ডেটা পড়া বা লেখা হয়।
- ByteBuffer, CharBuffer, ShortBuffer, IntBuffer ইত্যাদি বিভিন্ন ধরনের বাফার রয়েছে।
- Channel:
- Channels হল I/O অপারেশনের জন্য মূল অবজেক্ট। এর মাধ্যমে ডেটা buffer-এ পড়ে বা লেখে।
- FileChannel, SocketChannel, DatagramChannel ইত্যাদি ধরণের চ্যানেল রয়েছে।
- Selector:
- Selector ক্লাস একটি multiplexer হিসাবে কাজ করে যা একাধিক channel থেকে ডেটা পড়ার কাজ করে।
- Non-blocking I/O অপারেশন পরিচালনার জন্য এটি ব্যবহার করা হয়।
Java NIO এর উদাহরণ:
1. Non-blocking File Read using FileChannel and ByteBuffer
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class NonBlockingFileReadExample {
public static void main(String[] args) {
try (RandomAccessFile file = new RandomAccessFile("input.txt", "r");
FileChannel channel = file.getChannel()) {
// Create a buffer with capacity to hold 1024 bytes
ByteBuffer buffer = ByteBuffer.allocate(1024);
// Read data into buffer
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip(); // Prepare the buffer for reading
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get()); // Read data from the buffer
}
buffer.clear(); // Clear the buffer for the next read
bytesRead = channel.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে
FileChannelব্যবহার করা হয়েছে একটি ফাইল থেকে ডেটা পড়তে। - ByteBuffer ব্যবহার করা হয়েছে ডেটা পড়তে এবং লেখার জন্য।
- Non-blocking মোডে ডেটা পড়া হচ্ছে, এবং
flip()এবংclear()মেথড ব্যবহার করে বাফারকে পরবর্তী অপারেশনের জন্য প্রস্তুত করা হচ্ছে।
2. Non-blocking Socket Communication using Selector
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
public class NonBlockingSocketExample {
public static void main(String[] args) {
try {
// Open a selector
Selector selector = Selector.open();
// Create a ServerSocketChannel for listening
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false); // Set non-blocking mode
serverChannel.bind(new java.net.InetSocketAddress(8080));
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// Wait for events
selector.select();
// Iterate through the selected keys
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
ServerSocketChannel channel = (ServerSocketChannel) key.channel();
SocketChannel clientChannel = channel.accept();
clientChannel.configureBlocking(false); // Set client to non-blocking
clientChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel clientChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = clientChannel.read(buffer);
if (bytesRead != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
}
}
}
selector.selectedKeys().clear(); // Clear the selected keys for next iteration
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
ServerSocketChannelএবংSocketChannelব্যবহার করে একটি non-blocking সার্ভার এবং ক্লায়েন্ট কমিউনিকেশন তৈরি করা হয়েছে।- Selector ব্যবহার করে সার্ভার একাধিক ক্লায়েন্টের সাথে যোগাযোগ পরিচালনা করতে সক্ষম।
Java NIO এর সুবিধা:
- Non-blocking I/O:
- NIO non-blocking I/O অপারেশন সমর্থন করে, যার মানে একটি থ্রেড একাধিক I/O অপারেশনকে একসাথে প্রক্রিয়া করতে পারে।
- High Performance:
- Buffers এবং Channels দ্রুত ডেটা এক্সেস করতে সহায়ক, বিশেষ করে বৃহৎ ডেটা সেটের জন্য।
- Selectors for Multiplexing:
- Selectors একাধিক channels থেকে ডেটা পড়তে সক্ষম করে, যা multi-threaded applications এর জন্য কার্যকর।
- Improved Memory Efficiency:
- Buffers ব্যবহার করে ডেটা সরাসরি মেমরিতে রাখা যায়, যা file I/O এবং network I/O অপারেশনের জন্য memory efficiency বৃদ্ধি করে।
Java NIO এর সীমাবদ্ধতা:
- Complexity:
- NIO কোড লেখা কিছুটা জটিল হতে পারে, বিশেষ করে Selectors এবং Channels ব্যবহারের সময়।
- Limited High-Level Abstraction:
- NIO এর উচ্চ স্তরের অ্যাবস্ট্রাকশন তুলনামূলকভাবে কম, তাই কিছু বিশেষ কাজ করতে low-level handling প্রয়োজন হতে পারে।
- Not Supported in IDE:
- System.console() এবং কিছু NIO ফিচার, বিশেষত non-blocking I/O টুলস IDE তে ঠিকভাবে কাজ নাও করতে পারে।
- Java NIO একটি শক্তিশালী এবং কার্যকরী API যা non-blocking I/O সমর্থন করে এবং performance এবং efficiency বৃদ্ধি করতে সহায়ক।
- Channels, Buffers, এবং Selectors এর মাধ্যমে multi-threading এবং high-performance I/O সম্ভব হয়।
- Java NIO বিশেষ করে large-scale applications, file manipulation, এবং network communication এর জন্য উপযুক্ত।
Content added By
Read more