Java-তে I/O (Input/Output) অপারেশন হলো এমন প্রক্রিয়া, যার মাধ্যমে প্রোগ্রাম বাইরের উৎস থেকে ডেটা পড়ে বা বাইরের উৎসে ডেটা লেখে। Java এর java.io এবং java.nio প্যাকেজগুলোতে বিভিন্ন ক্লাস এবং ইন্টারফেস রয়েছে, যা এই I/O কার্যক্রম সম্পাদন করতে সহায়ক।
Java I/O এর মৌলিক ধারণা
Java I/O বিভিন্ন উৎস যেমন ফাইল, কনসোল, নেটওয়ার্ক, এবং মেমোরি থেকে ডেটা পড়া এবং লেখা নিশ্চিত করে। Java I/O স্ট্রিম দুটি প্রধান ভাগে বিভক্ত:
- Input Stream: বাইরের উৎস থেকে ডেটা প্রোগ্রামে পড়ে আনার জন্য ব্যবহৃত হয়।
- Output Stream: প্রোগ্রাম থেকে বাইরের উৎসে ডেটা লেখার জন্য ব্যবহৃত হয়।
স্ট্রিম কি?
স্ট্রিম হলো একটি ধারাবাহিক ডেটার প্রবাহ যা ডেটা পড়া বা লেখার মাধ্যমে পরিচালিত হয়। স্ট্রিমকে প্রধানত দুই ভাগে ভাগ করা যায়:
- Byte Stream: বাইনারি ডেটা পরিচালনার জন্য ব্যবহৃত হয়। ক্লাস:
InputStream,OutputStream - Character Stream: টেক্সট ডেটা পরিচালনার জন্য ব্যবহৃত হয়। ক্লাস:
Reader,Writer
Java I/O এর প্রধান ক্লাসসমূহ
১. File ক্লাস
File ক্লাস ফাইল এবং ডিরেক্টরি ব্যবস্থাপনার জন্য ব্যবহৃত হয়। এর সাহায্যে ফাইল তৈরি, মুছে ফেলা, এবং বিভিন্ন তথ্য পাওয়া সম্ভব।
File ক্লাস উদাহরণ:
import java.io.File;
public class FileExample {
public static void main(String[] args) {
File file = new File("example.txt");
// ফাইল তৈরি করা
try {
if (file.createNewFile()) {
System.out.println("File created: " + file.getName());
} else {
System.out.println("File already exists.");
}
} catch (Exception e) {
System.out.println("An error occurred.");
e.printStackTrace();
}
// ফাইলের তথ্য দেখা
System.out.println("File path: " + file.getAbsolutePath());
}
}
আউটপুট:
File created: example.txt
File path: /path/to/example.txt
২. FileInputStream এবং FileOutputStream
FileInputStream এবং FileOutputStream ক্লাসগুলো ফাইল থেকে বাইনারি ডেটা পড়া এবং লেখা নিশ্চিত করে।
FileInputStream এবং FileOutputStream উদাহরণ:
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileStreamExample {
public static void main(String[] args) {
try {
// ফাইলে লেখা
FileOutputStream fos = new FileOutputStream("output.txt");
String text = "Hello, Java I/O!";
fos.write(text.getBytes());
fos.close();
// ফাইল থেকে পড়া
FileInputStream fis = new FileInputStream("output.txt");
int content;
while ((content = fis.read()) != -1) {
System.out.print((char) content);
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Hello, Java I/O!
৩. FileReader এবং FileWriter
FileReader এবং FileWriter ক্লাসগুলো চরিত্র ভিত্তিক ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়।
FileReader এবং FileWriter উদাহরণ:
import java.io.FileReader;
import java.io.FileWriter;
public class FileCharacterStreamExample {
public static void main(String[] args) {
try {
// ফাইলে লেখা
FileWriter writer = new FileWriter("character_output.txt");
writer.write("Java I/O Character Stream");
writer.close();
// ফাইল থেকে পড়া
FileReader reader = new FileReader("character_output.txt");
int content;
while ((content = reader.read()) != -1) {
System.out.print((char) content);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Java I/O Character Stream
৪. BufferedReader এবং BufferedWriter
BufferedReader এবং BufferedWriter ক্লাসগুলো বড় আকারের ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়। এই ক্লাসগুলো বাফার ব্যবহার করে I/O অপারেশনকে আরও দ্রুত করে তোলে।
BufferedReader এবং BufferedWriter উদাহরণ:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class BufferedExample {
public static void main(String[] args) {
try {
// ফাইলে লেখা
BufferedWriter writer = new BufferedWriter(new FileWriter("buffered_output.txt"));
writer.write("Java I/O with Buffered Streams");
writer.newLine();
writer.write("Buffered Writer Example");
writer.close();
// ফাইল থেকে পড়া
BufferedReader reader = new BufferedReader(new FileReader("buffered_output.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
আউটপুট:
Java I/O with Buffered Streams
Buffered Writer Example
Java NIO (New I/O)
Java NIO (Non-blocking I/O) হলো Java I/O এর একটি উন্নত সংস্করণ, যা বড় আকারের ডেটা কার্যক্রম এবং নন-ব্লকিং অপারেশন সাপোর্ট করে। এটি java.nio প্যাকেজে পাওয়া যায়। NIO এর প্রধান উপাদানসমূহ:
- Buffers: ডেটা সংরক্ষণ করে।
- Channels: ডেটা পড়া এবং লেখার মাধ্যমে কার্য সম্পাদন করে।
- Selectors: নন-ব্লকিং অপারেশনের জন্য ব্যবহার করা হয়।
Java I/O এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- সহজ ব্যবহারযোগ্য: বিভিন্ন ক্লাস এবং মেথডের সাহায্যে ফাইলের সাথে কাজ করা সহজ।
- টাইপভিত্তিক স্ট্রিম: Byte এবং Character স্ট্রিম আলাদাভাবে ডেটা হ্যান্ডল করে।
- বাফারিং: বড় ডেটা কার্যক্রমে বাফারিং ব্যবহার করে কার্যক্ষমতা বৃদ্ধি করে।
সীমাবদ্ধতা:
- ব্লকিং অপারেশন: Java I/O ব্লকিং অপারেশন করে, যা বড় প্রোগ্রামে কিছু ক্ষেত্রে সমস্যা তৈরি করে।
- কম কার্যক্ষমতা: বড় ডেটা কার্যক্রমে Java NIO তুলনামূলকভাবে দ্রুত।
সারসংক্ষেপ
Java I/O একটি শক্তিশালী ফিচার যা প্রোগ্রামে বিভিন্ন উৎস থেকে ডেটা পড়া ও লেখা সহজ করে। File, FileInputStream, FileOutputStream, FileReader, FileWriter, BufferedReader, এবং BufferedWriter এর মতো ক্লাসগুলো বিভিন্ন ধরনের ডেটা কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়। Java NIO একটি উন্নত সংস্করণ যা নন-ব্লকিং অপারেশনের মাধ্যমে কার্যক্ষমতা বাড়ায়।
Java তে ফাইল রিডিং এবং ফাইল রাইটিং বা ফাইল থেকে ডেটা পড়া এবং ফাইলে ডেটা লেখা খুবই গুরুত্বপূর্ণ এবং বহুল ব্যবহৃত অপারেশন। Java-তে এই কাজের জন্য java.io প্যাকেজে বিভিন্ন ক্লাস এবং মেথড উপলব্ধ রয়েছে, যা ফাইল পরিচালনা সহজ করে তোলে।
ফাইল রিডিং (File Reading)
Java তে ফাইল রিডিং করতে FileReader, BufferedReader, Scanner ইত্যাদি ক্লাস ব্যবহার করা হয়।
উদাহরণ: FileReader এবং BufferedReader ব্যবহার করে ফাইল রিডিং
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class FileReadingExample {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("Error reading file: " + e.getMessage());
}
}
}
ব্যাখ্যা:
FileReaderদিয়ে ফাইল খোলা হয়েছে এবংBufferedReaderএর মাধ্যমে ফাইলের প্রতিটি লাইন পড়া হয়েছে।readLine()মেথড প্রতিবার একটি করে লাইন পড়ে এবংnullরিটার্ন করলে লুপ শেষ হয়।
উদাহরণ: Scanner ব্যবহার করে ফাইল রিডিং
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileReadingWithScanner {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (Scanner scanner = new Scanner(new File(filePath))) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.out.println("File not found: " + e.getMessage());
}
}
}
ব্যাখ্যা:
Scannerক্লাস ব্যবহার করে ফাইল থেকে প্রতিটি লাইন পড়া হয়েছে।hasNextLine()মেথড চেক করে লাইন আছে কি না, এবংnextLine()মেথডে লাইনটি রিটার্ন করে।
ফাইল রাইটিং (File Writing)
Java তে ফাইল রাইটিং করতে FileWriter, BufferedWriter, এবং PrintWriter ক্লাস ব্যবহার করা হয়।
উদাহরণ: FileWriter ব্যবহার করে ফাইল রাইটিং
import java.io.FileWriter;
import java.io.IOException;
public class FileWritingExample {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (FileWriter writer = new FileWriter(filePath)) {
writer.write("Hello, World!\n");
writer.write("Java File Writing Example.");
System.out.println("Data written to file.");
} catch (IOException e) {
System.out.println("Error writing to file: " + e.getMessage());
}
}
}
ব্যাখ্যা:
FileWriterদিয়ে ফাইল খোলা হয়েছে এবংwrite()মেথড ব্যবহার করে ফাইলে ডেটা লেখা হয়েছে।try-with-resourcesব্লক ব্যবহৃত হওয়ায়FileWriterনিজে থেকেই বন্ধ হয়ে যাবে।
উদাহরণ: BufferedWriter ব্যবহার করে ফাইল রাইটিং
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedWriterExample {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
writer.write("Hello, World!");
writer.newLine(); // নতুন লাইন
writer.write("This is an example of file writing with BufferedWriter.");
System.out.println("Data written to file with BufferedWriter.");
} catch (IOException e) {
System.out.println("Error writing to file: " + e.getMessage());
}
}
}
ব্যাখ্যা:
BufferedWriterব্যবহার করে ফাইলে ডেটা লেখা হয়েছে এবংnewLine()মেথড দিয়ে নতুন লাইন তৈরি করা হয়েছে।BufferedWriterFileWriterএর উপরে একটি বাফার প্রদান করে, যা লেখার পারফরম্যান্স উন্নত করে।
উদাহরণ: PrintWriter ব্যবহার করে ফাইল রাইটিং
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterExample {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (PrintWriter writer = new PrintWriter(new FileWriter(filePath))) {
writer.println("Hello, World!");
writer.println("This is an example of file writing with PrintWriter.");
System.out.println("Data written to file with PrintWriter.");
} catch (IOException e) {
System.out.println("Error writing to file: " + e.getMessage());
}
}
}
ব্যাখ্যা:
PrintWriterব্যবহার করে ফাইলে ডেটা লেখা হয়েছে, এবংprintln()মেথড ব্যবহার করে সহজে নতুন লাইন তৈরি করা হয়েছে।PrintWriterবিভিন্ন ধরনের ডেটা সহজে ফাইলে লেখার জন্য আদর্শ।
ফাইল অ্যাপেন্ড করা
ফাইল অ্যাপেন্ড করতে FileWriter এর দ্বিতীয় প্যারামিটার true সেট করা হয়, যাতে নতুন ডেটা পুরনো ডেটার শেষে যোগ হয়।
import java.io.FileWriter;
import java.io.IOException;
public class FileAppendExample {
public static void main(String[] args) {
String filePath = "example.txt"; // ফাইলের পথ
try (FileWriter writer = new FileWriter(filePath, true)) {
writer.write("\nAppending new data to the file.");
System.out.println("Data appended to file.");
} catch (IOException e) {
System.out.println("Error appending to file: " + e.getMessage());
}
}
}
ব্যাখ্যা:
new FileWriter(filePath, true)ব্যবহার করা হয়েছে, যা ফাইলে নতুন ডেটা যোগ করে এবং পূর্বের ডেটা বজায় রাখে।
ফাইল রিডিং ও রাইটিং সংক্ষেপে
| ক্লাস | কাজ | ব্যবহারের ধরন |
|---|---|---|
FileReader | ফাইল থেকে ডেটা পড়া | শুধুমাত্র রিডিং |
BufferedReader | ফাইলের ডেটা দ্রুত পড়া | লাইন ভিত্তিক রিডিং |
Scanner | ফাইল থেকে ডেটা রিডিং | টোকেন বা লাইন রিডিং |
FileWriter | ফাইলে ডেটা লেখা | সাধারণ রাইটিং |
BufferedWriter | দ্রুত ফাইল লেখা | বাফার ভিত্তিক রাইটিং |
PrintWriter | ফাইল লেখা সহজ করে | println ও printf দিয়ে লেখা |
সারসংক্ষেপ
- ফাইল রিডিং:
FileReader,BufferedReader, এবংScannerদিয়ে ফাইল থেকে ডেটা পড়া হয়। - ফাইল রাইটিং:
FileWriter,BufferedWriter, এবংPrintWriterদিয়ে ফাইলে ডেটা লেখা হয়। - ফাইল অ্যাপেন্ড করতে
FileWriterএর দ্বিতীয় প্যারামিটারtrueব্যবহার করা হয়।
Java তে ফাইল রিডিং এবং রাইটিং অপারেশন বিভিন্ন অ্যাপ্লিকেশন ডেভেলপমেন্টে ডেটা সংরক্ষণ ও ব্যবস্থাপনায় কার্যকরীভাবে সহায়ক।
Java তে BufferedReader এবং FileWriter হলো দুটি গুরুত্বপূর্ণ ক্লাস, যা ফাইলের ডেটা পড়া এবং লেখার জন্য ব্যবহৃত হয়। BufferedReader বড় আকারের ডেটা দ্রুত পড়তে এবং FileWriter ফাইলে ডেটা লেখার জন্য ব্যবহার করা হয়।
BufferedReader
BufferedReader হলো একটি ক্লাস যা ইনপুট স্ট্রিম বা রিডারকে বাফার করে, যার ফলে বড় আকারের ডেটা দ্রুত পড়া যায়। এটি বিশেষত ফাইল বা ইনপুট স্ট্রিম থেকে ডেটা লাইনের মাধ্যমে পড়তে সহায়ক।
BufferedReader এর মূল মেথড
- readLine(): এক লাইনের ডেটা পড়ে এবং এটি
nullরিটার্ন করে যখন EOF (End of File) এ পৌঁছে যায়। - close(): BufferedReader বন্ধ করার জন্য ব্যবহৃত হয় এবং এটি সকল রিসোর্স রিলিজ করে।
BufferedReader ব্যবহার উদাহরণ
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
String line;
while ((line = reader.readLine()) != null) { // EOF এ পৌঁছানো পর্যন্ত লাইনে লাইনে পড়ে
System.out.println(line);
}
reader.close(); // BufferedReader বন্ধ করা
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে
BufferedReaderব্যবহার করেinput.txtফাইলটি লাইনে লাইনে পড়া হয়েছে। readLine()মেথডের মাধ্যমে এক লাইনের ডেটা পড়া হয় এবং পরবর্তীতে কনসোলে প্রদর্শিত হয়।
FileWriter
FileWriter হলো একটি ক্লাস যা একটি ফাইলে ডেটা লেখার জন্য ব্যবহৃত হয়। এটি মূলত character stream হিসেবে কাজ করে এবং ফাইল লেখার সময় নতুন ফাইল তৈরি করে বা বিদ্যমান ফাইলের উপর লেখা চালিয়ে যায়।
FileWriter এর মূল মেথড
- write(String str): নির্দিষ্ট স্ট্রিং ফাইলে লেখে।
- append(CharSequence csq): ফাইলের শেষে ডেটা যুক্ত করে।
- flush(): লেখার কার্যক্রম শেষ করার পরে সমস্ত ডেটা ফাইলে লেখে।
- close(): FileWriter বন্ধ করে এবং রিসোর্স মুক্ত করে।
FileWriter ব্যবহার উদাহরণ
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterExample {
public static void main(String[] args) {
try {
FileWriter writer = new FileWriter("output.txt");
writer.write("Hello, Java I/O!\n"); // ফাইলে ডেটা লেখা
writer.write("This is an example of FileWriter.\n");
writer.close(); // FileWriter বন্ধ করা
System.out.println("Successfully written to the file.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে
FileWriterব্যবহার করেoutput.txtফাইলে ডেটা লেখা হয়েছে। write()মেথড ব্যবহার করে স্ট্রিং আকারে ডেটা ফাইলে সংরক্ষণ করা হয়েছে।- লেখার কাজ শেষে
close()মেথড ব্যবহার করেFileWriterবন্ধ করা হয়েছে।
BufferedReader এবং FileWriter একসাথে ব্যবহার
BufferedReader এবং FileWriter একসাথে ব্যবহার করে একটি ফাইল থেকে ডেটা পড়ে অন্য ফাইলে লেখার কাজ করা যায়।
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyFileExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
FileWriter writer = new FileWriter("output.txt");
String line;
while ((line = reader.readLine()) != null) {
writer.write(line + "\n"); // লাইনে লাইনে লেখার কাজ
}
reader.close(); // BufferedReader বন্ধ
writer.close(); // FileWriter বন্ধ
System.out.println("File copied successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- এখানে
input.txtফাইলটিBufferedReaderব্যবহার করে লাইনে লাইনে পড়া হয়েছে। - প্রতিটি লাইন
FileWriterব্যবহার করেoutput.txtফাইলে লেখা হয়েছে। - কাজ শেষে
BufferedReaderএবংFileWriterবন্ধ করা হয়েছে।
BufferedReader এবং FileWriter এর সুবিধা ও সীমাবদ্ধতা
BufferedReader এর সুবিধা
- বড় ডেটা দ্রুত পড়তে সহায়ক।
- লাইনের মাধ্যমে ডেটা পড়া যায়, যা টেক্সট ফাইলের জন্য সুবিধাজনক।
BufferedReader এর সীমাবদ্ধতা
- এটি শুধুমাত্র পড়ার কাজেই ব্যবহৃত হয়, লেখার জন্য নয়।
FileWriter এর সুবিধা
- সহজে ফাইলে টেক্সট লেখা যায়।
- বিদ্যমান ফাইলে লেখা চালিয়ে যাওয়ার (append) সুবিধা প্রদান করে।
FileWriter এর সীমাবদ্ধতা
- এটি শুধুমাত্র লেখা কার্যক্রমের জন্য ব্যবহৃত হয়, পড়ার জন্য নয়।
সারসংক্ষেপ
Java-তে BufferedReader এবং FileWriter ফাইলের সাথে কাজ করার জন্য অত্যন্ত কার্যকরী ক্লাস। BufferedReader বড় আকারের টেক্সট ফাইল পড়তে ব্যবহার করা হয়, যেখানে FileWriter টেক্সট ফাইলে ডেটা লেখার জন্য ব্যবহৃত হয়। একসাথে ব্যবহার করে একটি ফাইল থেকে ডেটা পড়ে অন্য ফাইলে লেখার কাজ সহজে সম্পন্ন করা যায়, যা প্রোগ্রামের কার্যক্ষমতা বাড়ায়।
সিরিয়ালাইজেশন (Serialization) হলো একটি প্রক্রিয়া যেখানে একটি অবজেক্টের স্টেট বা ডেটা বাইনারি ফরম্যাটে রূপান্তরিত করা হয়, যাতে সেটি ফাইল, ডাটাবেস বা নেটওয়ার্কে প্রেরণ করা যায়। Java তে Serializable ইন্টারফেস ব্যবহার করে অবজেক্ট সিরিয়ালাইজ করা হয়। সিরিয়ালাইজেশন এর বিপরীত প্রক্রিয়া হলো ডিসিরিয়ালাইজেশন (Deserialization), যার মাধ্যমে বাইনারি ফরম্যাট থেকে অবজেক্ট পুনরুদ্ধার করা হয়।
কেন সিরিয়ালাইজেশন প্রয়োজন?
- অবজেক্ট স্থায়ী রাখা: অবজেক্টের স্টেট বা ডেটা ফাইলে সংরক্ষণ করে রাখা যায় এবং পরবর্তীতে প্রোগ্রাম পুনরায় চালু হলে তা পুনরুদ্ধার করা যায়।
- ডেটা প্রেরণ: নেটওয়ার্কের মাধ্যমে অবজেক্টের ডেটা প্রেরণ করতে সিরিয়ালাইজেশন গুরুত্বপূর্ণ।
- ডাটাবেস স্টোরেজ: ডাটাবেসে অবজেক্ট সংরক্ষণ করতে সিরিয়ালাইজেশন ব্যবহার করা হয়।
- ক্যাশিং: অবজেক্টকে দ্রুত পুনরায় ব্যবহারের জন্য সিরিয়ালাইজ করা যায়।
সিরিয়ালাইজেশন কিভাবে কাজ করে?
Java তে একটি অবজেক্টকে সিরিয়ালাইজ করতে হলে সেই ক্লাসে Serializable ইন্টারফেস ইমপ্লিমেন্ট করতে হয়। Serializable ইন্টারফেসে কোনো মেথড নেই; এটি মার্কার ইন্টারফেস, যা কেবল অবজেক্টকে সিরিয়ালাইজযোগ্য হিসেবে চিহ্নিত করে।
উদাহরণ: অবজেক্ট সিরিয়ালাইজেশন
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Employee implements Serializable {
private static final long serialVersionUID = 1L; // সিরিয়াল ভার্সন ইউআইডি
String name;
int age;
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) {
Employee emp = new Employee("John Doe", 30);
try (FileOutputStream fileOut = new FileOutputStream("employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut)) {
out.writeObject(emp); // অবজেক্ট সিরিয়ালাইজ করা
System.out.println("Employee object serialized successfully.");
} catch (IOException e) {
System.out.println("Serialization error: " + e.getMessage());
}
}
}
ব্যাখ্যা:
Employeeক্লাসেSerializableইন্টারফেস ইমপ্লিমেন্ট করা হয়েছে, যাemployee.serফাইলে সিরিয়ালাইজ করা হয়েছে।ObjectOutputStreamএর মাধ্যমে অবজেক্টটিwriteObject()মেথড ব্যবহার করে ফাইলে সংরক্ষণ করা হয়েছে।
ডিসিরিয়ালাইজেশন (Deserialization)
সিরিয়ালাইজ করা অবজেক্ট পুনরুদ্ধার করতে ObjectInputStream ব্যবহার করা হয়, যা বাইনারি ফাইল থেকে অবজেক্ট পুনরায় তৈরি করে।
উদাহরণ: অবজেক্ট ডিসিরিয়ালাইজেশন
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializationExample {
public static void main(String[] args) {
try (FileInputStream fileIn = new FileInputStream("employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn)) {
Employee emp = (Employee) in.readObject(); // অবজেক্ট ডিসিরিয়ালাইজ করা
System.out.println("Employee Name: " + emp.name);
System.out.println("Employee Age: " + emp.age);
} catch (IOException | ClassNotFoundException e) {
System.out.println("Deserialization error: " + e.getMessage());
}
}
}
ব্যাখ্যা:
ObjectInputStreamদিয়েemployee.serফাইল থেকে অবজেক্ট ডিসিরিয়ালাইজ করা হয়েছে।readObject()মেথডের মাধ্যমে ফাইল থেকে অবজেক্ট পড়া হয়েছে এবং অবজেক্টের প্রোপার্টি প্রিন্ট করা হয়েছে।
সিরিয়ালাইজেশন সংক্রান্ত গুরুত্বপূর্ণ বিষয়
serialVersionUID: প্রতিটি সিরিয়ালাইজেবল ক্লাসে একটি serialVersionUID ফিল্ড থাকতে পারে, যা অবজেক্টের ভার্সন নির্দেশ করে। কোনো পরিবর্তন হলে এই আইডি পরিবর্তন করা হয়, যা কম্প্যাটিবিলিটি নিশ্চিত করতে সহায়ক।
private static final long serialVersionUID = 1L;
transient কিওয়ার্ড: কোনো ফিল্ড যদি transient কিওয়ার্ড দ্বারা চিহ্নিত থাকে, তবে সেটি সিরিয়ালাইজ করা হয় না। এটি ব্যবহার করে সংবেদনশীল বা প্রয়োজনহীন ডেটা সিরিয়ালাইজ হওয়া থেকে রোধ করা যায়।
transient int socialSecurityNumber;
static ফিল্ড: static ফিল্ড সিরিয়ালাইজ করা হয় না কারণ এটি ক্লাসের সাথে সম্পর্কিত, অবজেক্টের সাথে নয়।
সিরিয়ালাইজেশন সংক্রান্ত কিছু সুবিধা এবং সীমাবদ্ধতা
সুবিধা
- অবজেক্ট স্থায়ী করা: সিরিয়ালাইজেশন ব্যবহার করে অবজেক্ট ফাইলে সংরক্ষণ করে স্থায়ী রাখা যায়।
- ডেটা শেয়ারিং সহজ: সিরিয়ালাইজেশন দ্বারা সহজেই অবজেক্টের ডেটা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায়।
- ক্যাশিং: অ্যাপ্লিকেশনের কিছু অংশে অবজেক্ট ক্যাশে রাখা যায় এবং প্রয়োজন অনুযায়ী ডিসিরিয়ালাইজ করে ব্যবহার করা যায়।
সীমাবদ্ধতা
- বড় অবজেক্টের জন্য অকার্যকর: বড় এবং জটিল অবজেক্ট সিরিয়ালাইজ করলে অনেক বেশি মেমোরি এবং সময় লাগে।
- কম্প্যাটিবিলিটি সমস্যা: সিরিয়ালাইজেবল ক্লাসে কোনো পরিবর্তন করলে ডিসিরিয়ালাইজেশনে সমস্যা হতে পারে, যদি
serialVersionUIDঠিকভাবে ব্যবহার না করা হয়। - নিরাপত্তা ঝুঁকি: ডিসিরিয়ালাইজেশন নিরাপত্তা ঝুঁকির কারণ হতে পারে যদি অবজেক্ট নির্ভরযোগ্য উৎস থেকে না আসে, কারণ এটি আক্রমণের সুযোগ সৃষ্টি করতে পারে।
উদাহরণ: Transient ফিল্ড ব্যবহার
class Employee implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
transient int socialSecurityNumber; // এটি সিরিয়ালাইজ হবে না
public Employee(String name, int age, int ssn) {
this.name = name;
this.age = age;
this.socialSecurityNumber = ssn;
}
}
ব্যাখ্যা:
- এখানে
socialSecurityNumberফিল্ডটিtransientহওয়ায় এটি সিরিয়ালাইজ হবে না। - ডিসিরিয়ালাইজ করার সময় এই ফিল্ডের ডিফল্ট মান সেট হবে, যেমন ইন্টিজার হলে ০।
সারসংক্ষেপ
- সিরিয়ালাইজেশন হলো প্রক্রিয়া যেখানে অবজেক্টের ডেটা বাইনারি ফরম্যাটে রূপান্তরিত করা হয়, যাতে তা ফাইলে সংরক্ষণ বা নেটওয়ার্কের মাধ্যমে প্রেরণ করা যায়।
- ডিসিরিয়ালাইজেশন হলো বিপরীত প্রক্রিয়া, যা বাইনারি ফরম্যাট থেকে অবজেক্ট পুনরুদ্ধার করে।
Serializableইন্টারফেস এবংserialVersionUIDদিয়ে সিরিয়ালাইজেবল ক্লাস তৈরি করা হয়।transientকিওয়ার্ড ব্যবহার করে প্রয়োজনহীন ফিল্ডগুলোকে সিরিয়ালাইজ হওয়া থেকে বিরত রাখা যায়।
সিরিয়ালাইজেশন ব্যবহার করে অবজেক্ট স্থায়ী করা, নেটওয়ার্কে ডেটা শেয়ারিং এবং ডেটা স্টোরেজ সহজ হয়, যা অনেক অ্যাপ্লিকেশন ডেভেলপমেন্টে সহায়ক।
Read more