Java NIO (New I/O) হল Java 1.4 সংস্করণে আনা একটি নতুন I/O লাইব্রেরি, যা traditional I/O এর তুলনায় অধিক কার্যকরী এবং দ্রুত। Java NIO প্রধানত Buffers, Channels, এবং Selectors ব্যবহার করে I/O অপারেশন পরিচালনা করে এবং blocking I/O এর পরিবর্তে non-blocking I/O সমর্থন করে। এর ফলে, Java NIO উন্নত পারফরম্যান্স এবং দক্ষতা প্রদান করে, বিশেষ করে high-volume data processing এর ক্ষেত্রে।
Java NIO এর প্রধান কম্পোনেন্ট
- Buffers
- Channels
- Selectors
1. Buffers:
Buffer হল Java NIO এর একটি প্রধান কম্পোনেন্ট, যা ডেটা ধারণ এবং ম্যানিপুলেশন করার জন্য ব্যবহৃত হয়। এটি একটি container যা ডেটা ধারণ করে, এবং read, write, flip, clear ইত্যাদি অপারেশনগুলি পরিচালনা করে।
Buffer এর মূল বৈশিষ্ট্য:
- ByteBuffer, CharBuffer, IntBuffer, LongBuffer, DoubleBuffer, FloatBuffer, ShortBuffer – এই সকল বাফার primitive data types এর জন্য প্রস্তুত করা হয়েছে।
- Direct Buffers – ডেটা স্থানান্তরের জন্য direct buffers দ্রুত I/O অপারেশন করতে সাহায্য করে।
Buffer এর অপারেশন:
- put() – বাফারে ডেটা লেখার জন্য ব্যবহৃত হয়।
- get() – বাফার থেকে ডেটা পড়ার জন্য ব্যবহৃত হয়।
- flip() – ডেটা লেখার পর বাফারটি reading mode-এ পরিবর্তন করার জন্য ব্যবহৃত হয়।
- clear() – বাফারটি reset করে।
Buffer উদাহরণ:
import java.nio.ByteBuffer;
public class BufferExample {
public static void main(String[] args) {
// Create a buffer of size 10
ByteBuffer buffer = ByteBuffer.allocate(10);
// Write data to the buffer
buffer.put((byte) 10);
buffer.put((byte) 20);
buffer.put((byte) 30);
// Switch to reading mode
buffer.flip();
// Read data from the buffer
while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
}
}
ব্যাখ্যা:
- ByteBuffer তৈরি করা হয়েছে, এবং তারপর ডেটা লেখা হয়েছে। flip() মেথড ব্যবহার করে এটি read mode এ চলে এসেছে। পরে, get() মেথড দ্বারা ডেটা পড়া হয়েছে।
2. Channels:
Channel হল একটি I/O উপাদান যা Buffer এর সাথে কাজ করে। Channels data transfer এর মাধ্যমে buffers এর সাথে যোগাযোগ স্থাপন করে। Java NIO তে Channels কম্পিউটার বা নেটওয়ার্ক থেকে ডেটা পড়তে এবং লেখার জন্য ব্যবহৃত হয়।
Channels এর প্রকার:
- FileChannel: ফাইল থেকে ডেটা পড়তে এবং লেখার জন্য ব্যবহৃত হয়।
- SocketChannel: সকেটের মাধ্যমে নেটওয়ার্কে ডেটা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়।
- ServerSocketChannel: সার্ভার সাইডে সবার সাথে কানেকশন তৈরির জন্য ব্যবহৃত হয়।
- DatagramChannel: UDP সেগমেন্টে ডেটা পাঠানোর জন্য ব্যবহৃত হয়।
Channel উদাহরণ:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class ChannelExample {
public static void main(String[] args) throws IOException {
// Create a file channel
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel channel = file.getChannel();
// Write data to the channel
ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.clear();
buffer.put("Hello, Java NIO!".getBytes());
buffer.flip();
channel.write(buffer);
// Close channel
file.close();
}
}
ব্যাখ্যা:
- FileChannel ব্যবহার করে একটি ফাইলের মাধ্যমে ডেটা লেখা হয়েছে। ByteBuffer এর মাধ্যমে ডেটা চ্যানেলে পাঠানো হয়েছে।
3. Selectors:
Selector হল একটি multiplexor যা একাধিক Channel এর I/O অপারেশন পরিচালনা করতে ব্যবহৃত হয়। Selector নির্ধারণ করে কোন Channel প্রস্তুত আছে (যেমন পড়ার জন্য বা লেখার জন্য প্রস্তুত) এবং এটি non-blocking I/O অপারেশন করতে সহায়ক।
Selector এর মূল বৈশিষ্ট্য:
- Select method: এটি চ্যানেলের মধ্যে কোনটি ready তা চেক করে।
- Non-blocking I/O: Selector ব্যবহার করে non-blocking I/O পরিচালনা করা সম্ভব, যার ফলে একাধিক চ্যানেল পরিচালনা করা যায় একসাথে।
Selector উদাহরণ:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class SelectorExample {
public static void main(String[] args) throws IOException {
// Open a server socket channel
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.socket().bind(new InetSocketAddress(8080));
serverSocket.configureBlocking(false); // Non-blocking mode
// Open a selector
Selector selector = Selector.open();
serverSocket.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// Wait for events on the registered channels
selector.select();
// Get selected keys
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
// Handle new connection
System.out.println("Connection accepted");
}
}
// Clear selected keys
selector.selectedKeys().clear();
}
}
}
ব্যাখ্যা:
- ServerSocketChannel তৈরি করা হয়েছে এবং Selector ব্যবহার করে non-blocking I/O মোডে কানেকশন সত্ত্বেও ইভেন্ট হ্যান্ডলিং করা হচ্ছে।
Java NIO এর সুবিধা:
- Non-blocking I/O:
- Java NIO non-blocking I/O সমর্থন করে, যেখানে একাধিক Channels একযোগে পরিচালনা করা যায়। এটি Selector ব্যবহার করে ঘটানো হয়, যা একই থ্রেডে একাধিক I/O অপারেশন পরিচালনা করতে সক্ষম।
- Performance:
- Buffers এর মাধ্যমে ডেটা দ্রুত পড়া এবং লেখা যায় কারণ এটি কম্পিউটার মেমরির উপর সরাসরি কাজ করে।
- Direct Buffers ব্যবহার করলে, ডেটা মেমরি থেকে সরাসরি I/O অপারেশন করা যায়, যা আরও দ্রুত পারফরম্যান্স দেয়।
- Scalability:
- Selectors একাধিক চ্যানেল পরিচালনা করতে সক্ষম, যার ফলে এটি উচ্চ কার্যকারিতাসম্পন্ন এবং স্কেলেবল I/O অপারেশন প্রদান করে।
Java NIO এর সীমাবদ্ধতা:
- Complexity:
- NIO কিছুটা জটিল হতে পারে, কারণ এতে Selector এবং Buffering এর মাধ্যমে কাজ করতে হয়, যা traditional I/O থেকে কিছুটা কঠিন হতে পারে।
- Limited Support for Older Systems:
- পুরনো অপারেটিং সিস্টেমগুলিতে কিছু NIO অপারেশন সম্পূর্ণ সমর্থিত নাও হতে পারে।
- Java NIO (New I/O) Java 1.4 থেকে কার্যকরী ফিচার যা Buffers, Channels, এবং Selectors ব্যবহার করে ডেটা দ্রুত এবং কার্যকরীভাবে পড়া এবং লেখা সম্ভব করে।
- Buffers ডেটা স্টোরেজের জন্য ব্যবহৃত হয়, Channels ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়, এবং Selectors একাধিক চ্যানেলের উপর non-blocking I/O অপারেশন পরিচালনা করে।
- Java NIO ব্যবহার করে আপনি high-performance এবং scalable I/O অপারেশন পরিচালনা করতে পারেন, যা পরবর্তী প্রজন্মের Java অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত উপকারী।
Read more