Java NIO (New Input/Output) হলো Java I/O API-র একটি আপডেটেড সংস্করণ, যা Java 1.4 তে প্রবর্তিত হয়েছিল। এটি বিশেষভাবে বৃহৎ ডেটা সেট এবং ব্রোডকাস্ট/কমপ্লেক্স ডেটা প্রসেস করার জন্য উন্নত ফিচার এবং কার্যকারিতা প্রদান করে। NIO-এর মাধ্যমে ব্লকিং I/O অপারেশন এবং বাফারিং, চ্যানেল ব্যবহার করে নন-ব্লকিং I/O অপারেশন করা সম্ভব।
NIO মূলত Byte Channels, Buffers, Selectors এবং Charsets-এর মাধ্যমে ডেটা পরিচালনা করার জন্য ব্যবহৃত হয়। এটি স্ট্রিম ভিত্তিক ট্রান্সফার এবং রিয়েল-টাইম ডেটা প্রসেসিংয়ের জন্য কার্যকরী, এবং বড় আকারের ডেটা হ্যান্ডলিংয়ের জন্য পারফরম্যান্স উন্নত করে।
Java NIO এর মৌলিক ধারণা
Java NIO-র মূল উপাদানগুলোর মধ্যে রয়েছে:
- Buffers:
Bufferহল একটি ডেটা স্টোরেজ যা primitive types (যেমনbyte,char,int,floatইত্যাদি) ডেটা রাখে। এটি একটি অ্যারে সিস্টেমের মত কাজ করে এবং স্ট্রিম বা চ্যানেলগুলির মাধ্যমে ডেটা প্রক্রিয়া করার সময় ব্যবহৃত হয়।
- Channels:
Channelহল একটি I/O অপারেশন যেখানে ডেটা চিত্রিত হয় এবং বাইনারি বা টেক্সট ডেটার স্ট্রিম প্যাসেজ সম্পাদন করতে ব্যবহৃত হয়।ChannelNIO-এর নতুন ধারণা, যা স্ট্রিমের সাথে তুলনায় আরও শক্তিশালী এবং দক্ষ।
- Selectors:
Selectorক্লাস NIO-তে নন-ব্লকিং I/O অপারেশন ব্যবহারের জন্য তৈরি করা হয়েছে। এটি একটি multiplexing মেকানিজম প্রদান করে, যার মাধ্যমে একাধিক চ্যানেল থেকে নন-ব্লকিং I/O পড়া এবং লেখা সম্ভব হয়।
- Charsets:
Charsetএকটি ক্লাস যা টেক্সট ডেটা এনকোড/ডিকোড করার জন্য ব্যবহৃত হয়। এটি ASCII বা Unicode রূপান্তর করতে সক্ষম, যা টেক্সট ডেটার স্ট্রিমিংয়ের সময় সাহায্য করে।
Java NIO-এর প্রধান উপাদান
1. Buffer
Buffer হলো একটি ডেটা কন্টেইনার, যেখানে আপনি ডেটা স্টোর বা রিড করতে পারেন। NIO-তে ডেটা শুধুমাত্র Buffer এ রাখা হয় এবং তারপর চ্যানেলগুলির মাধ্যমে প্রসেস করা হয়। Java NIO-তে Buffer-এর বিভিন্ন ধরনের রয়েছে যেমন:
- ByteBuffer
- CharBuffer
- IntBuffer
- FloatBuffer
ByteBuffer সবচেয়ে বেশি ব্যবহৃত এবং এটি বাইনারি ডেটা স্টোর করার জন্য ব্যবহৃত হয়।
2. Channel
Channel হলো একটি অগ্রগতির ইউনিট যা ডেটা পড়া এবং লেখা পরিচালনা করে। NIO চ্যানেল সাধারণত non-blocking হয় এবং FileChannel, SocketChannel এবং DatagramChannel এর মতো ক্লাসের মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা যায়। এগুলো blocking এবং non-blocking মোডে কাজ করতে সক্ষম।
3. Selector
Selector NIO-এর non-blocking I/O অপারেশন পরিচালনা করতে ব্যবহৃত হয়। এটি একাধিক চ্যানেল থেকে ডেটা পড়ার জন্য ব্যবহার করা হয়, তবে একটি থ্রেডের মাধ্যমে। Selectors বিভিন্ন I/O operations কে একত্রিত করে এবং সম্পন্ন হওয়ার পরে চেক করে, এটি polling অথবা selecting পদ্ধতির মাধ্যমে কাজ করে।
Java NIO এর উদাহরণ
ByteBuffer এর সাথে ফাইল থেকে ডেটা পড়া
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.io.IOException;
public class NIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileChannel fileChannel = fis.getChannel()) {
// ByteBuffer তৈরি
ByteBuffer buffer = ByteBuffer.allocate(1024);
// ফাইল থেকে ডেটা পড়া
int bytesRead = fileChannel.read(buffer);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buffer.flip(); // Bufffer-এর মধ্যে ডেটা রিড করার জন্য প্রস্তুত
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get()); // ডেটা আউটপুটে প্রিন্ট
}
buffer.clear(); // Bufffer রিসেট করা
bytesRead = fileChannel.read(buffer);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileChannel এবং ByteBuffer ব্যবহার করে ফাইল থেকে ডেটা পড়া হচ্ছে।
- flip() এবং clear() মেথডগুলি ব্যবহৃত হচ্ছে buffer কে প্রস্তুত করার জন্য, যাতে ডেটা পড়া এবং লেখার জন্য এগুলি সঠিকভাবে প্রস্তুত থাকে।
Selector ব্যবহার করে নন-ব্লকিং I/O
import java.nio.channels.*;
import java.nio.*;
import java.net.*;
import java.io.IOException;
public class SelectorExample {
public static void main(String[] args) {
try {
// সার্ভার সকেট তৈরি
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(5000));
serverSocketChannel.configureBlocking(false); // non-blocking mode
// Selector তৈরি
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// Ready channels চেক করা
selector.select();
for (SelectionKey key : selector.selectedKeys()) {
if (key.isAcceptable()) {
// ক্লায়েন্ট কানেকশন গ্রহণ
SocketChannel clientChannel = serverSocketChannel.accept();
clientChannel.configureBlocking(false);
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) {
clientChannel.close();
} else {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
}
}
}
selector.selectedKeys().clear();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- ServerSocketChannel এবং SocketChannel ব্যবহার করে নেটওয়ার্কের মাধ্যমে non-blocking I/O প্রক্রিয়া করা হচ্ছে।
- Selector ব্যবহার করা হচ্ছে, যাতে একাধিক চ্যানেল থেকে ডেটা একত্রিতভাবে পড়া যায় এবং non-blocking I/O পারফর্মেন্স বৃদ্ধি করা যায়।
Java NIO এর সুবিধা
- Performance Improvement: NIO non-blocking I/O এর মাধ্যমে বড় ডেটা সেটের জন্য কার্যকরী এবং দ্রুত I/O অপারেশন সরবরাহ করে।
- Multiple Channel Handling: Selectors ব্যবহার করে একাধিক চ্যানেল একযোগভাবে পরিচালনা করা যায়।
- Memory Mapped Files: NIO-এর মাধ্যমে বড় ফাইলের memory-mapped I/O সম্ভব, যা ডেটা প্রসেসিংকে আরও দ্রুত করে তোলে।
- Scalability: NIO অত্যন্ত স্কেলেবল, বিশেষত যখন একাধিক ক্লায়েন্ট বা থ্রেডের সাথে যোগাযোগ করতে হয়।
Java NIO এর সীমাবদ্ধতা
- Complexity: NIO সাধারণ I/O-এর চেয়ে কিছুটা জটিল হতে পারে, কারণ এর জন্য অতিরিক্ত কোড এবং ধারণা প্রয়োজন (যেমন Channels, Buffers, Selectors)।
- Not Simple for Small Applications: ছোট অ্যাপ্লিকেশনে NIO-এর ব্যবহার অতিরিক্ত জটিলতা আনতে পারে।
- Error Handling: NIO-তে ত্রুটির ব্যবস্থা আরও জটিল এবং দক্ষতার সঙ্গে পরিচালনা করতে হয়।
Java NIO হল একটি শক্তিশালী I/O প্রযুক্তি যা বড় ডেটা সেটের সাথে কাজ করার জন্য ব্যবহৃত হয়। এটি Buffers, Channels, Selectors এবং Charsets ব্যবহার করে ডেটা পড়া, লেখা এবং প্রসেসিংকে আরও দ্রুত ও কার্যকরী করে তোলে। NIO মূলত non-blocking I/O সমর্থন করে, যা সিস্টেমের কর্মক্ষমতা উন্নত করতে সাহায্য করে এবং সিঙ্ক্রোনাস I/O-এর চেয়ে অধিক কার্যকর।
Read more