Java NIO (New Input/Output) হল Java 1.4-এ অন্তর্ভুক্ত একটি শক্তিশালী I/O API যা traditional I/O (Blocking I/O) এর তুলনায় অনেক বেশি দ্রুত এবং কার্যকরী। NIO non-blocking I/O সাপোর্ট করে, যা বড় ডেটা সেট, প্যারালাল I/O, এবং high-performance network programming এর জন্য খুবই উপযোগী। এটি file-based I/O, network-based I/O এবং memory-mapped I/O কাজ করার জন্য একটি উন্নত API প্রদান করে।
Java NIO এর মূল বৈশিষ্ট্য:
- Non-blocking I/O (Asynchronous I/O):
- Non-blocking মডেলটি ব্যবহারকারীদের একই থ্রেডে একাধিক I/O অপারেশন করতে দেয়, অর্থাৎ এক অপারেশন চলতে থাকা অবস্থায় অন্য অপারেশনগুলি ব্লক হয় না। এটি high-concurrency পরিবেশে কার্যকরী।
- Buffers:
- NIO buffering ধারণাটি ব্যবহার করে, যেখানে byte buffer বা char buffer ব্যবহার করে ডেটা স্টোর করা হয়। এটি I/O অপারেশনগুলির জন্য আরও কার্যকরী এবং দ্রুত।
- Channels:
- Channels হল streams এর মতো, তবে এগুলি read এবং write করতে ব্যবহৃত হয় এবং buffers এর সাথে কাজ করে। এটি একধরনের bi-directional I/O পদ্ধতি।
- Selectors:
- Selectors একটি বা একাধিক channels এর মধ্যে non-blocking I/O অপারেশন পরিচালনা করতে সহায়ক। এটি একটি multiplexing প্রযুক্তি, যেখানে একাধিক I/O অপারেশন একই থ্রেডে পরিচালিত হতে পারে।
- Memory-Mapped Files:
- NIO এর মাধ্যমে আপনি memory-mapped files তৈরি করতে পারেন, যা বড় ফাইলের সাথে কার্যকরীভাবে কাজ করতে সহায়ক এবং direct memory access প্রদান করে। এটি high-performance file I/O এর জন্য উপযুক্ত।
Java NIO এবং Traditional I/O এর মধ্যে পার্থক্য:
| বিষয় | Traditional I/O (Blocking I/O) | NIO (New I/O) |
|---|---|---|
| Blocking vs Non-blocking | Blocking - I/O অপারেশন চলাকালীন থ্রেড ব্লক হয়ে থাকে। | Non-blocking - একাধিক অপারেশন একসাথে চলতে পারে। |
| Data Handling | স্ট্রীম ভিত্তিক ডেটা। | Buffer ভিত্তিক ডেটা, যেখানে buffer ব্যবহৃত হয়। |
| Concurrency | এক থ্রেড একটি I/O অপারেশন করতে পারে। | একাধিক থ্রেডে একাধিক I/O অপারেশন একসাথে চলতে পারে। |
| Performance | বড় ডেটা এবং নেটওয়ার্ক I/O-তে ধীর গতি। | উচ্চ কার্যকারিতা, দ্রুত ডেটা প্রসেসিং। |
| Selector Support | No selector support (one thread per connection) | Selectors দিয়ে একাধিক channels-এ non-blocking I/O সাপোর্ট। |
Java NIO এর উপকারিতা:
- Non-blocking I/O:
- Java NIO non-blocking I/O সাপোর্ট করে, যার মাধ্যমে একই থ্রেডে একাধিক I/O অপারেশন পরিচালনা করা যায়, যা high concurrency প্রয়োজনীয় অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত।
- Buffering:
- Buffering ব্যবহার করে Java NIO একাধিক ডেটা একযোগে এবং দ্রুত পরিচালনা করতে সক্ষম। এটি I/O performance বৃদ্ধি করতে সাহায্য করে।
- Efficient File Handling:
- Java NIO memory-mapped file এবং direct I/O ব্যবহারের মাধ্যমে বৃহৎ ফাইলগুলির সাথে দ্রুত কাজ করতে সক্ষম।
- Selectors and Multiplexing:
- Selectors প্রযুক্তি ব্যবহার করে একটি থ্রেড একাধিক channels পরিচালনা করতে পারে, যা network programming এর জন্য খুবই উপকারী। একে event-driven programming বলা হয়।
- Improved Performance:
- Java NIO বিভিন্ন I/O অপারেশন একত্রিত করে high-performance data processing প্রদান করে, যা traditional I/O এর তুলনায় অনেক দ্রুত।
Java NIO এর প্রধান উপাদানসমূহ:
- Buffers:
- NIO তে Buffers (যেমন ByteBuffer, CharBuffer, IntBuffer, ইত্যাদি) ব্যবহার করে ডেটা স্টোর এবং প্রসেস করা হয়। Buffers ডেটা ধারণ করার জন্য একটি ধারাবাহিক মেমরি অঞ্চল হিসেবে কাজ করে।
- Channels:
- Channel হল I/O স্ট্রীমের মতো, তবে এটি buffer এর সাথে কাজ করে। এটি read এবং write করার জন্য ব্যবহার হয়।
- উদাহরণ: FileChannel, SocketChannel, DatagramChannel, ServerSocketChannel।
- Selectors:
- Selector একটি multiplexer যা একাধিক channels এর উপর non-blocking I/O অপারেশন পরিচালনা করতে সক্ষম। এটি একাধিক socket connections বা file channels পরিচালনা করতে ব্যবহৃত হয়।
- Charsets:
- Java NIO এর মাধ্যমে Character Encoding এবং Decoding কাজ করার জন্য Charset এবং CharsetDecoder / CharsetEncoder ক্লাস ব্যবহার করা হয়।
Java NIO উদাহরণ:
1. File Reading and Writing with NIO:
import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.file.*;
public class NIOFileExample {
public static void main(String[] args) throws IOException {
// File Reading with NIO
Path path = Paths.get("input.txt");
byte[] fileBytes = Files.readAllBytes(path);
System.out.println(new String(fileBytes));
// File Writing with NIO
Path outputPath = Paths.get("output.txt");
String content = "This is a test written using Java NIO.";
Files.write(outputPath, content.getBytes());
System.out.println("File written successfully using NIO.");
}
}
ব্যাখ্যা:
- Files.readAllBytes() এবং Files.write() মেথডের মাধ্যমে NIO এর সাথে ফাইল পড়া এবং লেখা হচ্ছে।
- এখানে Path এবং Files ক্লাস ব্যবহার করা হয়েছে।
2. Non-Blocking I/O with NIO:
import java.io.IOException;
import java.nio.channels.*;
import java.nio.*;
import java.net.*;
public class NIOClientServer {
public static void main(String[] args) throws IOException {
// Creating a server socket channel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(5000));
serverSocketChannel.configureBlocking(false); // non-blocking mode
// Creating a selector for multiplexing
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select(); // wait for events
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
SocketChannel client = serverSocketChannel.accept();
System.out.println("Client connected: " + client.getRemoteAddress());
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(256);
int bytesRead = client.read(buffer);
if (bytesRead == -1) {
client.close();
} else {
System.out.println("Received message: " + new String(buffer.array()));
}
}
}
selector.selectedKeys().clear();
}
}
}
ব্যাখ্যা:
- ServerSocketChannel এবং SocketChannel ব্যবহার করে একটি non-blocking server তৈরি করা হয়েছে।
- Selector ব্যবহার করে multiplexing করা হয়েছে যাতে একাধিক client connections একসাথে পরিচালনা করা যায়।
- Java NIO হল একটি শক্তিশালী I/O API যা non-blocking I/O, buffers, channels, এবং selectors ব্যবহার করে high-performance I/O অপারেশন করতে সহায়ক।
- এটি file handling, network communication, এবং high-concurrency systems-এ ব্যবহৃত হয়।
- traditional I/O এর তুলনায় Java NIO অনেক দ্রুত এবং কার্যকরী, বিশেষ করে বৃহৎ ডেটা সেট এবং প্যারালাল অপারেশনগুলির জন্য।
Java NIO ব্যবহার করে আপনি file I/O, socket communication, এবং asynchronous processing খুব সহজে এবং দক্ষভাবে করতে পারবেন।
Content added By
Read more