Java I/O (Input/Output) প্যাকেজটি java.io প্যাকেজের অধীনে রয়েছে এবং এর সাহায্যে Java প্রোগ্রামগুলিতে ডেটা পড়া, লেখা, এবং ডেটার সাথে ইন্টারঅ্যাক্ট করার জন্য নানা ধরনের অপারেশন সম্পাদন করা হয়। Java I/O মূলত ফাইল সিস্টেম, নেটওয়ার্ক, এবং অন্যান্য ডেটা সোর্সের সাথে যোগাযোগ স্থাপন করতে ব্যবহৃত হয়।
Java I/O এর আর্কিটেকচার অনেকটা stream-oriented এবং event-driven। এটি stream-based I/O এবং object-based I/O এর সমন্বয়ে তৈরি করা হয়েছে। Stream-based I/O ডেটা একে একে (sequentially) পরিচালনা করে, যেখানে Object-based I/O অবজেক্টগুলি পড়ে এবং লেখে।
Java I/O এর বেসিক আর্কিটেকচার:
Java I/O এর প্রধান উপাদানগুলি নিম্নলিখিত:
- Streams
- Readers and Writers
- File I/O
- Serialization
1. Streams
Streams হল একটি ধারাবাহিক ডেটা প্রবাহ, যেখানে ডেটা একটি সোর্স থেকে গন্তব্যে প্রবাহিত হয়। Java I/O সিস্টেম মূলত দুটি ধরনের স্ট্রিম প্রদান করে:
- Byte Streams: বাইনারি ডেটা (যেমন ছবি, ভিডিও, অডিও, ইত্যাদি) পড়া এবং লেখা। এতে
InputStreamএবংOutputStreamক্লাস অন্তর্ভুক্ত। - Character Streams: টেক্সট ডেটা (যেমন স্ট্রিং, টেক্সট ফাইল) পড়া এবং লেখা। এতে
ReaderএবংWriterক্লাস অন্তর্ভুক্ত।
2. Byte Streams
- Byte Streams বাইনারি ডেটা পরিচালনা করে। এর প্রধান ক্লাসগুলো হল:
- InputStream: ডেটা পড়ার জন্য।
- OutputStream: ডেটা লেখার জন্য।
Byte Streams এর উদাহরণ:
FileInputStream: ফাইল থেকে ডেটা পড়ার জন্য।FileOutputStream: ফাইলে ডেটা লেখার জন্য।
উদাহরণ:
import java.io.*;
public class ByteStreamExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("input.bin");
FileOutputStream fos = new FileOutputStream("output.bin")) {
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
System.out.println("File copied using byte stream.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Character Streams
- Character Streams টেক্সট ডেটা পরিচালনা করে। এই স্ট্রিমগুলো Unicode সাপোর্ট করে, যার ফলে টেক্সট ডেটা প্রক্রিয়া করার সময় Encoding এবং Decoding স্বয়ংক্রিয়ভাবে করা হয়। এর প্রধান ক্লাসগুলো হল:
- Reader: টেক্সট ডেটা পড়ার জন্য।
- Writer: টেক্সট ডেটা লেখার জন্য।
Character Streams এর উদাহরণ:
FileReader: ফাইল থেকে টেক্সট পড়ার জন্য।FileWriter: ফাইলে টেক্সট লেখার জন্য।
উদাহরণ:
import java.io.*;
public class CharacterStreamExample {
public static void main(String[] args) {
try (FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")) {
int data;
while ((data = fr.read()) != -1) {
fw.write(data);
}
System.out.println("File copied using character stream.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. Serialization and Deserialization
Java I/O এর আরেকটি গুরুত্বপূর্ণ দিক হল Serialization এবং Deserialization। Serialization এর মাধ্যমে আপনি Java অবজেক্টগুলোকে বাইনারি ফর্ম্যাটে রূপান্তর করতে পারেন এবং তা স্টোর করতে পারেন (ফাইল, নেটওয়ার্ক, ডাটাবেস)। Deserialization এর মাধ্যমে সেই অবজেক্টগুলো পুনরায় তৈরি করা হয়।
- Serialization: অবজেক্টকে স্ট্রিমে রূপান্তর করা।
- Deserialization: স্ট্রিম থেকে অবজেক্ট তৈরি করা।
উদাহরণ:
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 SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// Serialization
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Object serialized");
} catch (IOException e) {
e.printStackTrace();
}
// Deserialization
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized object: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
Personঅবজেক্টটি প্রথমে Serialization করা হয়, এবং পরে Deserialization এর মাধ্যমে পুনরায় তৈরি করা হয়।
Java I/O এর বেসিক আর্কিটেকচারের প্রধান উপাদানগুলো:
- Streams:
- Byte Streams:
InputStream,OutputStream। - Character Streams:
Reader,Writer।
- Byte Streams:
- Readers and Writers:
- BufferedReader: দ্রুত ইনপুট পড়ার জন্য।
- BufferedWriter: দ্রুত আউটপুট লেখার জন্য।
- File I/O:
- File: ফাইল এবং ডিরেক্টরি পরিচালনা।
- FileInputStream, FileOutputStream: বাইনারি ডেটা পড়া এবং লেখা।
- Serialization:
- ObjectOutputStream: অবজেক্টকে স্ট্রিমে রূপান্তর।
- ObjectInputStream: স্ট্রিম থেকে অবজেক্ট পুনরুদ্ধার।
Java I/O এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- সহজ ডেটা ম্যানিপুলেশন: Java I/O API ব্যবহার করে বিভিন্ন ডেটা সোর্স (ফাইল, নেটওয়ার্ক, মেমোরি) থেকে ডেটা পড়া এবং লেখা সহজে করা যায়।
- প্রসেসিং পারফরম্যান্স: Buffered Streams এবং Memory Mapped Files এর মাধ্যমে ডেটা প্রক্রিয়াকরণ দ্রুত করা যায়।
- বিকল্প ফরম্যাট সাপোর্ট: Java NIO এবং Java Streams API যেমন পারালাল প্রসেসিং এবং আরও উন্নত ফিচার সাপোর্ট করে।
সীমাবদ্ধতা:
- বড় ফাইলের সাথে সমস্যা: যখন বড় ফাইল বা ডেটা হ্যান্ডেল করতে হয়, তখন স্ট্রিম অপারেশনগুলি কিছুটা ধীর হতে পারে।
- ব্যবহারের জটিলতা: I/O অপারেশনগুলি সঠিকভাবে পরিচালনা করা এবং ত্রুটির মোকাবিলা করা কখনও কখনও জটিল হতে পারে।
- Blocking I/O: যদি আপনি non-blocking I/O অপারেশন করতে চান, তবে Java NIO বা Asynchronous I/O ব্যবহারের প্রয়োজন।
Java I/O প্যাকেজের Streams, Readers, Writers, এবং Serialization এর মাধ্যমে আপনি সহজেই ফাইল I/O, নেটওয়ার্ক I/O, এবং অবজেক্ট I/O অপারেশনগুলি পরিচালনা করতে পারবেন। Java I/O সিস্টেম বিভিন্ন ধরণের ডেটা সোর্সের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি শক্তিশালী এবং নমনীয় টুল সরবরাহ করে।
Read more