Traditional I/O এবং NIO (New I/O) হলো Java I/O সিস্টেমের দুটি প্রধান পদ্ধতি, যা ফাইল এবং নেটওয়ার্ক অপারেশন সম্পাদনের জন্য ব্যবহৃত হয়। এগুলির মধ্যে মূল পার্থক্য রয়েছে ব্লকিং I/O, প্যারালাল প্রসেসিং, মেমরি ব্যবস্থাপনা এবং পারফরম্যান্স এর দিক থেকে।
Traditional I/O:
Traditional I/O হল পুরানো I/O পদ্ধতি যা Java 1.0 থেকে ব্যবহৃত হচ্ছে। এটি Byte Streams এবং Character Streams ব্যবহার করে ডেটা পড়তে এবং লিখতে সক্ষম। এটি সাধারণভাবে blocking I/O এর মাধ্যমে কাজ করে, অর্থাৎ একটি থ্রেড ডেটা প্রক্রিয়া করতে অপেক্ষা করবে যতক্ষণ না অপারেশনটি সম্পন্ন হয়।
Traditional I/O এর বৈশিষ্ট্য:
- Stream-Based:
InputStreamএবংOutputStreamব্যবহার করে ডেটা পড়া এবং লেখা হয়। - Blocking I/O: স্ট্রীমে ডেটা পড়া বা লেখার সময় থ্রেড ব্লক হয়ে থাকে। অর্থাৎ, পরবর্তী অপারেশন সম্পন্ন হওয়ার আগে থ্রেড অপেক্ষা করে।
- Single Threaded: এটি একে একে কাজ করে, এবং একমাত্র থ্রেড কাজের মধ্যে থেকে যায়।
- Simplicity: Traditional I/O কোডের মধ্যে সাদামাটা এবং সহজ। যদিও এটি performance এর ক্ষেত্রে কম কার্যকরী হতে পারে, তবে কোড লেখা সহজ।
NIO (New I/O):
Java 1.4 এ NIO বা New I/O সিস্টেম তৈরি হয়েছিল, যার উদ্দেশ্য ছিল performance এবং scalability উন্নত করা। NIO non-blocking I/O সাপোর্ট করে এবং প্যারালাল থ্রেডিং ব্যবস্থাপনা সহজ করে।
NIO এর বৈশিষ্ট্য:
- Buffer-Based I/O:
ByteBufferএবংCharBufferব্যবহার করে ডেটা পড়া এবং লেখা হয়। এটি stream-based I/O এর পরিবর্তে buffer-based I/O। - Non-Blocking I/O: Non-blocking I/O সাপোর্ট করে, অর্থাৎ এক থ্রেড ডেটা প্রক্রিয়া করার সময় অন্য থ্রেড অন্য কাজ করতে পারে। এটি selector-based যা ইভেন্ট ড্রিভেন প্রোগ্রামিংয়ে সহায়ক।
- Selectors: Selectors ব্যবহার করে একাধিক channels (যেমন file channel, socket channel) থেকে ডেটা পড়া যায়।
- Scalability: NIO scalable এবং বড় ডেটা সেট এবং বহু কনেকশনের জন্য আরো কার্যকর।
Traditional I/O এবং NIO এর মধ্যে প্রধান পার্থক্য:
| বিষয় | Traditional I/O | NIO (New I/O) |
|---|---|---|
| পদ্ধতি | Stream-based I/O | Buffer-based I/O (এবং Selector-based I/O) |
| I/O Model | Blocking I/O | Non-blocking I/O |
| Performance | কম পারফরম্যান্স, কারণ থ্রেড এক সময়ে একে একে কাজ করে | উচ্চ পারফরম্যান্স, কারণ একাধিক থ্রেড প্যারালাল কাজ করতে পারে |
| Threading Model | একে একে থ্রেড পরিচালনা করে (Single Threaded) | Multiple threads (এবং Selectors) একসাথে কাজ করতে পারে |
| File Handling | FileInputStream, FileOutputStream | FileChannel, Path, Files |
| Blocking Nature | Yes (থ্রেড ব্লক হয়) | No (থ্রেড ব্লক হয় না, selector এর মাধ্যমে ইভেন্ট ড্রাইভেন) |
| Buffering | Not used explicitly, relies on stream-based reading/writing | Buffering is explicit, requires ByteBuffer and CharBuffer |
| Memory Usage | Less efficient for large data handling | More efficient for large data handling via buffers |
| API Complexity | Simple API, easy to use for small applications | Complex API, requires careful management of Selector, Channels, etc. |
| Scalability | Limited scalability for handling large-scale applications | Highly scalable, can handle many connections or large files efficiently |
| Use Cases | Simple I/O tasks, small applications | Large-scale applications, network I/O, non-blocking I/O tasks |
Traditional I/O Example:
import java.io.*;
public class TraditionalIOExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt")) {
int byteData;
while ((byteData = fis.read()) != -1) {
System.out.print((char) byteData); // Print byte by byte
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileInputStream ব্যবহার করে byte-by-byte ডেটা পড়া হচ্ছে।
- এটি blocking I/O পদ্ধতির মাধ্যমে কাজ করছে, অর্থাৎ একটি থ্রেড অপেক্ষা করবে যতক্ষণ না ডেটা পড়া শেষ হয়।
NIO Example:
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class NIOExample {
public static void main(String[] args) {
try (FileChannel fileChannel = new FileInputStream("input.txt").getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (fileChannel.read(buffer) != -1) {
buffer.flip(); // Switch to read mode
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get()); // Print byte by byte
}
buffer.clear(); // Prepare for next read
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- FileChannel ব্যবহার করা হয়েছে ডেটা পড়তে এবং ByteBuffer এর মাধ্যমে তা প্রক্রিয়া করা হচ্ছে।
- এটি non-blocking I/O এর মাধ্যমে কাজ করে, যার মানে একাধিক ফাইল বা কননেকশনে ডেটা পড়া বা লেখা সম্ভব।
Traditional I/O এবং NIO এর মধ্যে পার্থক্য (সারাংশ):
- I/O Model:
- Traditional I/O: Blocking I/O (থ্রেড ব্লক হয়ে পড়ে বা লেখার সময়)
- NIO: Non-blocking I/O (একাধিক থ্রেড একই সময়ে কাজ করতে পারে)
- Performance:
- Traditional I/O: কম পারফরম্যান্স, কারণ একে একে I/O অপারেশন করতে হয়।
- NIO: উচ্চ পারফরম্যান্স, কারণ এটি buffering এবং selectors ব্যবহার করে দ্রুত I/O অপারেশন করে।
- Scalability:
- Traditional I/O: ছোট সিস্টেম এবং কম স্কেল অ্যাপ্লিকেশনের জন্য ভাল।
- NIO: বড় স্কেল সিস্টেম এবং বহুবছর কনকনেকশন একসাথে পরিচালনা করার জন্য উপযুক্ত।
- API Complexity:
- Traditional I/O: সহজ এবং ব্যবহার সহজ।
- NIO: একটু জটিল এবং বেশি কনফিগারেশন প্রয়োজন।
- Traditional I/O সহজ এবং ছোট আকারের অ্যাপ্লিকেশনের জন্য উপযুক্ত।
- NIO বড় এবং স্কেলেবল অ্যাপ্লিকেশনগুলির জন্য উন্নত, যেখানে high concurrency, high performance, এবং non-blocking I/O দরকার।
- NIO ব্যবহার করলে আপনি বৃহৎ ডেটা সেট বা বহু সংযোগের সাথে দক্ষভাবে কাজ করতে পারবেন, যা Traditional I/O এর জন্য সম্ভব নয়।
Read more