Traditional I/O এবং NIO এর মধ্যে পার্থক্য

Java NIO (New I/O) - জাভা আইও (Java.io Package) - Java Technologies

310

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/ONIO (New I/O)
পদ্ধতিStream-based I/OBuffer-based I/O (এবং Selector-based I/O)
I/O ModelBlocking I/ONon-blocking I/O
Performanceকম পারফরম্যান্স, কারণ থ্রেড এক সময়ে একে একে কাজ করেউচ্চ পারফরম্যান্স, কারণ একাধিক থ্রেড প্যারালাল কাজ করতে পারে
Threading Modelএকে একে থ্রেড পরিচালনা করে (Single Threaded)Multiple threads (এবং Selectors) একসাথে কাজ করতে পারে
File HandlingFileInputStream, FileOutputStreamFileChannel, Path, Files
Blocking NatureYes (থ্রেড ব্লক হয়)No (থ্রেড ব্লক হয় না, selector এর মাধ্যমে ইভেন্ট ড্রাইভেন)
BufferingNot used explicitly, relies on stream-based reading/writingBuffering is explicit, requires ByteBuffer and CharBuffer
Memory UsageLess efficient for large data handlingMore efficient for large data handling via buffers
API ComplexitySimple API, easy to use for small applicationsComplex API, requires careful management of Selector, Channels, etc.
ScalabilityLimited scalability for handling large-scale applicationsHighly scalable, can handle many connections or large files efficiently
Use CasesSimple I/O tasks, small applicationsLarge-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 এর মধ্যে পার্থক্য (সারাংশ):

  1. I/O Model:
    • Traditional I/O: Blocking I/O (থ্রেড ব্লক হয়ে পড়ে বা লেখার সময়)
    • NIO: Non-blocking I/O (একাধিক থ্রেড একই সময়ে কাজ করতে পারে)
  2. Performance:
    • Traditional I/O: কম পারফরম্যান্স, কারণ একে একে I/O অপারেশন করতে হয়।
    • NIO: উচ্চ পারফরম্যান্স, কারণ এটি buffering এবং selectors ব্যবহার করে দ্রুত I/O অপারেশন করে।
  3. Scalability:
    • Traditional I/O: ছোট সিস্টেম এবং কম স্কেল অ্যাপ্লিকেশনের জন্য ভাল।
    • NIO: বড় স্কেল সিস্টেম এবং বহুবছর কনকনেকশন একসাথে পরিচালনা করার জন্য উপযুক্ত।
  4. API Complexity:
    • Traditional I/O: সহজ এবং ব্যবহার সহজ।
    • NIO: একটু জটিল এবং বেশি কনফিগারেশন প্রয়োজন।

  • Traditional I/O সহজ এবং ছোট আকারের অ্যাপ্লিকেশনের জন্য উপযুক্ত।
  • NIO বড় এবং স্কেলেবল অ্যাপ্লিকেশনগুলির জন্য উন্নত, যেখানে high concurrency, high performance, এবং non-blocking I/O দরকার।
  • NIO ব্যবহার করলে আপনি বৃহৎ ডেটা সেট বা বহু সংযোগের সাথে দক্ষভাবে কাজ করতে পারবেন, যা Traditional I/O এর জন্য সম্ভব নয়।
Content added By
Promotion

Are you sure to start over?

Loading...