Java Input/Output (Java I/O) একটি ডেটা ট্রান্সফার ফ্রেমওয়ার্ক, যা ডেটা পড়া এবং লেখা পরিচালনা করতে ব্যবহৃত হয়। এটি স্ট্রিম-ভিত্তিক ডেটা প্রসেসিং এর জন্য ডিজাইন করা হয়েছে এবং ফাইল, নেটওয়ার্ক, মেমরি বা অন্যান্য সোর্স থেকে ডেটা প্রক্রিয়াকরণে কার্যকর।
Java I/O এর মূল উপাদানসমূহ
Java I/O এর আর্কিটেকচার Stream ধারণার উপর ভিত্তি করে কাজ করে। এটি Input Stream এবং Output Stream দ্বারা দুটি প্রধান শ্রেণিতে বিভক্ত।
১. Streams:
- Input Stream: ডেটা পড়ার জন্য ব্যবহৃত হয়।
- Output Stream: ডেটা লেখার জন্য ব্যবহৃত হয়।
- Streams ফাইল, মেমরি, বা নেটওয়ার্কের মাধ্যমে ডেটা পাঠানোর জন্য কার্যকর।
২. Byte Streams এবং Character Streams
Java I/O দুটি প্রকারের স্ট্রিম সমর্থন করে:
- Byte Streams: বাইনারি ডেটা (byte-based) পড়া বা লেখার জন্য ব্যবহৃত হয়। উদাহরণ:
FileInputStream,FileOutputStream। - Character Streams: টেক্সট ডেটা (character-based) পড়া বা লেখার জন্য ব্যবহৃত হয়। উদাহরণ:
FileReader,FileWriter।
৩. Buffering:
Buffered স্ট্রিমগুলি বড় ডেটা প্রক্রিয়াকরণে কর্মক্ষমতা বাড়ায়। উদাহরণ:
BufferedReaderBufferedWriter
৪. Data Streams:
DataInputStream এবং DataOutputStream প্রিমিটিভ টাইপের ডেটা পড়তে এবং লিখতে ব্যবহৃত হয়।
৫. Object Streams:
ObjectInputStream এবং ObjectOutputStream অবজেক্ট সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে ব্যবহৃত হয়।
৬. NIO (New I/O):
Java NIO (introduced in Java 1.4) অ-প্রতিবন্ধক I/O এবং উচ্চ-পরিমাণ ডেটা প্রক্রিয়াকরণ সমর্থন করে।
Java I/O এর আর্কিটেকচারের মূল শ্রেণিগুলি
১. Byte Stream Classes
| Class | Description |
|---|---|
InputStream | Input (byte-based) এর মূল ক্লাস। |
FileInputStream | ফাইল থেকে ডেটা পড়ার জন্য ব্যবহৃত। |
OutputStream | Output (byte-based) এর মূল ক্লাস। |
FileOutputStream | ফাইলে ডেটা লেখার জন্য ব্যবহৃত। |
২. Character Stream Classes
| Class | Description |
|---|---|
Reader | Input (character-based) এর মূল ক্লাস। |
FileReader | ফাইল থেকে টেক্সট পড়ার জন্য ব্যবহৃত। |
Writer | Output (character-based) এর মূল ক্লাস। |
FileWriter | ফাইলে টেক্সট লেখার জন্য ব্যবহৃত। |
৩. Buffered Classes
| Class | Description |
|---|---|
BufferedReader | টেক্সট ডেটা পড়ার জন্য বাফার যোগ করে। |
BufferedWriter | টেক্সট ডেটা লেখার জন্য বাফার যোগ করে। |
৪. Data Stream Classes
| Class | Description |
|---|---|
DataInputStream | প্রিমিটিভ ডেটা পড়ার জন্য ব্যবহৃত। |
DataOutputStream | প্রিমিটিভ ডেটা লেখার জন্য ব্যবহৃত। |
৫. Object Stream Classes
| Class | Description |
|---|---|
ObjectInputStream | অবজেক্ট পড়ার জন্য ব্যবহৃত। |
ObjectOutputStream | অবজেক্ট লেখার জন্য ব্যবহৃত। |
Java I/O এর কার্যপদ্ধতি
Step 1: Input এবং Output Stream তৈরি
Input এবং Output Stream তৈরি করতে সংশ্লিষ্ট ক্লাস ব্যবহার করুন।
Example: Byte Stream
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Step 2: Buffering ব্যবহার করুন
Buffered Classes ব্যবহার করে বড় ডেটা প্রক্রিয়াকরণে কর্মক্ষমতা বাড়ান।
Example: BufferedReader এবং BufferedWriter
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedStreamExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Step 3: Object Serialization এবং Deserialization
অবজেক্ট স্টোর বা রিস্টোর করতে ObjectOutputStream এবং ObjectInputStream ব্যবহার করুন।
Example: Object Serialization
import java.io.*;
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class ObjectStreamExample {
public static void main(String[] args) {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"))) {
// Serialize
Person person = new Person("Alice", 25);
oos.writeObject(person);
// Deserialize
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Java NIO (New I/O) এর ভূমিকা
Java NIO (introduced in Java 1.4) অ-প্রতিবন্ধক (Non-blocking) এবং উচ্চ-পারফরম্যান্স ডেটা প্রক্রিয়াকরণের জন্য ব্যবহৃত হয়।
NIO এর মূল ধারণা
- Channels: ডেটা ট্রান্সমিশনের জন্য।
- Buffers: ডেটা সংরক্ষণের জন্য।
- Selectors: Multiple Channels পরিচালনার জন্য।
Example: FileChannel
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
public class NIOExample {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("data.txt", "rw");
FileChannel channel = file.getChannel();
// Perform operations with the channel
System.out.println("File size: " + channel.size());
channel.close();
file.close();
}
}
Java I/O এর সুবিধা এবং সীমাবদ্ধতা
| সুবিধা | সীমাবদ্ধতা |
|---|---|
| বিভিন্ন সোর্স থেকে ডেটা পড়া এবং লেখা সহজ। | বড় ডেটা প্রসেসিংয়ের জন্য পারফরম্যান্স সমস্যা। |
| Character এবং Byte Stream এর মাধ্যমে ফ্লেক্সিবিলিটি। | NIO তুলনায় কিছু ক্ষেত্রে ধীর। |
| Object Serialization সমর্থন। | Custom Serialization এর জন্য অতিরিক্ত কাজ। |
Java I/O এর বেসিক আর্কিটেকচার ব্যবহার করে ডেটা ট্রান্সফার এবং প্রসেসিং সহজ:
- Byte এবং Character Stream ডেটা প্রক্রিয়াকরণের জন্য কার্যকর।
- Buffered Stream বড় ডেটার জন্য উপযুক্ত।
- Object Serialization অবজেক্ট সংরক্ষণ এবং পুনরুদ্ধারের জন্য কার্যকর।
- বড় স্কেল অ্যাপ্লিকেশন বা রিয়েল-টাইম প্রক্রিয়ার জন্য Java NIO বিবেচনা করুন।
Read more