RandomAccessFile ক্লাস হল Java I/O প্যাকেজের একটি গুরুত্বপূর্ণ ক্লাস, যা ফাইলের যেকোনো অংশ থেকে ডেটা পড়া এবং লেখা করার জন্য ব্যবহৃত হয়। অন্যান্য I/O ক্লাসের (যেমন FileInputStream এবং FileOutputStream) তুলনায়, RandomAccessFile ক্লাসের একটি বড় সুবিধা হল এটি ফাইলের মধ্যে অবাধ (random) অ্যাক্সেস প্রদান করে। এর মানে হল যে আপনি ফাইলের যেকোনো অবস্থান থেকে ডেটা পড়তে বা লিখতে পারবেন, পরিবর্তে শুধুমাত্র ফাইলের শুরু থেকে পড়া বা লেখা।
RandomAccessFile ক্লাসের মাধ্যমে আপনি ফাইলের নির্দিষ্ট অবস্থানে ডেটা লেখার বা পড়ার মতো প্রতিটি অ্যাক্সেস কন্ট্রোল করতে পারবেন। এটি একটি file pointer বা file cursor ব্যবহার করে, যা ফাইলের মধ্যে একটি নির্দিষ্ট অবস্থানে চলে যায় এবং ডেটা পড়ে বা লেখে।
RandomAccessFile Class এর প্রধান বৈশিষ্ট্য:
- Random Access:
- ফাইলের যেকোনো অবস্থান থেকে ডেটা পড়া বা লেখা সম্ভব। এটি ফাইলের কোনও নির্দিষ্ট স্থান থেকে ডেটা randomly পড়তে বা লিখতে সক্ষম।
- File Pointer:
- File pointer বা file cursor ফাইলের মধ্যে বর্তমান অবস্থান নির্ধারণ করে। এটি
seek()মেথডের মাধ্যমে পরিবর্তন করা যায়।
- File pointer বা file cursor ফাইলের মধ্যে বর্তমান অবস্থান নির্ধারণ করে। এটি
- Data Types Supported:
- RandomAccessFile ব্যবহার করে আপনি primitive data types (যেমন
int,long,float,double,char) সহ String এবং byte array ডেটা পড়তে এবং লিখতে পারেন।
- RandomAccessFile ব্যবহার করে আপনি primitive data types (যেমন
- Read/Write Operations:
- এটি read(), write(), readInt(), writeInt(), readUTF(), writeUTF(), ইত্যাদি পদ্ধতি প্রদান করে, যা ফাইল থেকে ডেটা পড়তে এবং লিখতে ব্যবহৃত হয়।
- Concurrency:
- RandomAccessFile একাধিক থ্রেডের মাধ্যমে ব্যবহার করা যেতে পারে এবং প্রতিটি থ্রেডকে একটি নির্দিষ্ট ফাইল পজিশনে ডেটা পাঠানোর সুযোগ দেয়।
RandomAccessFile এর ব্যবহার:
1. File Pointer নির্ধারণ এবং Data Read/Write
RandomAccessFile ক্লাস ব্যবহার করে ফাইলের নির্দিষ্ট অবস্থানে ডেটা পড়া এবং লেখা করা হয়।
RandomAccessFile Example (File Reading and Writing):
import java.io.*;
public class RandomAccessFileExample {
public static void main(String[] args) {
try {
// RandomAccessFile ক্লাস ব্যবহার করে একটি ফাইল খুলা
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
// ফাইলের প্রথমে কিছু লেখা
file.writeUTF("Hello, this is an example of RandomAccessFile.\n");
// ফাইলের পয়েন্টারকে 0 পজিশনে ফেরত পাঠানো
file.seek(0);
// ফাইল থেকে পড়া
String data = file.readUTF();
System.out.println("Data read from file: " + data);
// ফাইলের মাঝখানে ডেটা লেখা
file.seek(20);
file.writeUTF("New data at position 20.");
// ফাইল পয়েন্টারকে আবার পড়ার জন্য শুরুর দিকে নিয়ে যাওয়া
file.seek(0);
// নতুন ডেটা পড়া
data = file.readUTF();
System.out.println("Updated Data read from file: " + data);
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
RandomAccessFileক্লাসের মাধ্যমেrwমোডে ফাইল খোলা হয়েছে, যার মাধ্যমে ফাইল থেকে পড়া এবং লেখার উভয় কাজ করা সম্ভব।seek()মেথড ব্যবহার করে ফাইলের পয়েন্টারকে একটি নির্দিষ্ট পজিশনে স্থানান্তর করা হয়েছে।writeUTF()এবংreadUTF()মেথডগুলি ফাইল থেকে UTF-8 encoded strings পড়া এবং লেখা করতে ব্যবহৃত হয়েছে।
আউটপুট (যদি example.txt ফাইল তৈরি হয়):
Data read from file: Hello, this is an example of RandomAccessFile.
Updated Data read from file: Hello, this is an example of RandomAccessFile.
2. File Pointer Control:
ফাইলের বর্তমান অবস্থান বা পয়েন্টার নিয়ন্ত্রণ করতে seek() মেথড ব্যবহার করা হয়।
import java.io.*;
public class RandomAccessFileSeekExample {
public static void main(String[] args) {
try {
// RandomAccessFile ক্লাস ব্যবহার করে ফাইল খুলা
RandomAccessFile file = new RandomAccessFile("data.txt", "rw");
// কিছু ডেটা লেখা
file.writeUTF("Java I/O is powerful.\n");
file.writeInt(12345);
file.writeDouble(3.14159);
// ফাইল পয়েন্টার 0 পজিশনে নিয়ে যাওয়া
file.seek(0);
// প্রথমে লেখা ডেটা পড়া
String text = file.readUTF();
int number = file.readInt();
double pi = file.readDouble();
// পড়া ডেটা প্রিন্ট করা
System.out.println("Text: " + text);
System.out.println("Number: " + number);
System.out.println("Pi: " + pi);
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
seek(0)ব্যবহার করে ফাইলের পয়েন্টার শুরুর দিকে ফিরিয়ে আনা হয়েছে, যাতে ফাইলের প্রথমে লিখিত ডেটা পড়া যায়।readUTF(),readInt(), এবংreadDouble()মেথডগুলি ফাইল থেকে ইউটিএফ-8 স্ট্রিং, পূর্ণসংখ্যা এবং ডাবল ভ্যালু পড়তে ব্যবহৃত হয়েছে।
আউটপুট:
Text: Java I/O is powerful.
Number: 12345
Pi: 3.14159
RandomAccessFile এর প্রধান মেথড:
| মেথড | বর্ণনা |
|---|---|
| read() | একটি বাইট পড়ে। |
| readUTF() | UTF-8 এনকোডেড স্ট্রিং পড়ে। |
| write() | একটি বাইট লেখে। |
| writeUTF() | UTF-8 এনকোডেড স্ট্রিং লেখে। |
| seek(long pos) | ফাইলের পয়েন্টারকে নির্দিষ্ট অবস্থানে নিয়ে যায়। |
| length() | ফাইলের মোট আকার রিটার্ন করে। |
| getFilePointer() | ফাইল পয়েন্টারের বর্তমান অবস্থান রিটার্ন করে। |
| close() | ফাইল স্ট্রীম বন্ধ করে। |
RandomAccessFile এর সুবিধা এবং সীমাবদ্ধতা:
সুবিধা:
- Random Access: আপনি ফাইলের যেকোনো পজিশন থেকে ডেটা পড়তে বা লিখতে পারেন।
- Efficient for Large Files: বড় ফাইলের জন্য খুবই কার্যকর, কারণ ফাইলের যেকোনো অংশে ডেটা পড়া বা লেখা সহজ।
- File Pointer Management: ফাইল পয়েন্টার ব্যবহার করে আপনি ডেটার অবস্থান নিয়ন্ত্রণ করতে পারেন।
সীমাবদ্ধতা:
- File System Dependent: এটি সিস্টেমের ফাইল সিস্টেমের উপর নির্ভরশীল এবং কিছু সীমাবদ্ধতা থাকতে পারে।
- No Direct Support for Text Streams: এটি binary streams এর জন্য উপযুক্ত, তবে text-based I/O এর জন্য BufferedReader বা BufferedWriter ব্যবহার করা উচিত।
- Complexity: RandomAccessFile ব্যবহারে কিছু জটিলতা থাকতে পারে যদি আপনি সঠিকভাবে seek() এবং pointer position ব্যবহার না করেন।
- RandomAccessFile Java-তে ফাইলের যেকোনো অংশে ডেটা পড়া এবং লেখা করার জন্য অত্যন্ত গুরুত্বপূর্ণ ক্লাস।
- এটি file pointer বা file cursor ব্যবহার করে ফাইলের মধ্যে random access পরিচালনা করে, যা অন্যান্য I/O ক্লাসের তুলনায় অনেক বেশি নমনীয়।
- RandomAccessFile শুধুমাত্র byte-based I/O সমর্থন করে, তাই text-based I/O এর জন্য অন্যান্য ক্লাস যেমন BufferedReader বা BufferedWriter ব্যবহার করা উচিত।
এই ক্লাসটি বড় ফাইলের ক্ষেত্রে বা যেখানে ফাইলের নির্দিষ্ট অংশে অ্যাক্সেস প্রয়োজন সেখানে খুবই কার্যকর।
RandomAccessFile হল Java I/O প্যাকেজের একটি ক্লাস, যা ফাইলের মধ্যে ডেটা র্যান্ডম অ্যাক্সেস করতে সহায়ক। এর মাধ্যমে আপনি একটি ফাইলে নির্দিষ্ট অবস্থানে সরাসরি পৌঁছাতে পারেন এবং সেখানে পড়তে বা লিখতে পারেন। এটি FileInputStream এবং FileOutputStream এর তুলনায় অনেক বেশি সুবিধাজনক, কারণ এতে আপনি ফাইলের যে কোনো পজিশন থেকে ডেটা পড়তে এবং লিখতে পারেন।
এটি নন-সিকোয়েন্সিয়াল অ্যাক্সেস ফাইলের জন্য ব্যবহৃত হয়, যা ফাইলের মধ্যে একটি নির্দিষ্ট স্থানে রিড/রাইট করার অনুমতি দেয়।
RandomAccessFile এর ধারণা:
- Random Access:
- RandomAccessFile ক্লাসের সবচেয়ে বড় বৈশিষ্ট্য হল এটি random access ফাইল অ্যাক্সেসের সুবিধা দেয়। আপনি ফাইলের শুরু থেকে শেষ পর্যন্ত শুধুমাত্র ধারাবাহিকভাবে পড়া বা লেখা করতে পারবেন না, বরং আপনি ফাইলের যেকোনো স্থানে সরাসরি পৌঁছাতে পারবেন।
- Reading and Writing:
- আপনি
read()এবংwrite()মেথড ব্যবহার করে ফাইলের মধ্যে ডেটা পড়া এবং লেখা করতে পারেন।
- আপনি
- File Pointer:
- RandomAccessFile একটি file pointer ব্যবহার করে, যা
seek()মেথড দ্বারা অবস্থান পরিবর্তন করতে পারে। ফাইলের যেখানে আপনি চান সেখান থেকে ডেটা পড়া বা লেখা সম্ভব।
- RandomAccessFile একটি file pointer ব্যবহার করে, যা
- Both Read and Write:
- এটি ফাইলের পড়তে এবং লিখতে উভয় কাজই করতে সক্ষম, অন্যথায় FileInputStream এবং FileOutputStream শুধুমাত্র একদিকে কাজ করে।
RandomAccessFile এর প্রধান মেথড:
| মেথড | বর্ণনা |
|---|---|
| read() | ফাইল থেকে একটি বাইট পড়ে। |
| readFully(byte[] b) | পুরো বাফারটি ফাইল থেকে পড়ে। |
| write(int b) | একটি বাইট ফাইলে লেখে। |
| write(byte[] b) | একটি বাফার ফাইলে লেখে। |
| seek(long pos) | ফাইল পয়েন্টারকে একটি নির্দিষ্ট অবস্থানে নিয়ে যায়। |
| getFilePointer() | বর্তমানে ফাইল পয়েন্টার কোথায় অবস্থান করছে তা রিটার্ন করে। |
| length() | ফাইলের মোট আকার (বাইটে) রিটার্ন করে। |
| close() | ফাইল বন্ধ করে। |
RandomAccessFile এর উদাহরণ
১. ফাইল থেকে ডেটা পড়া এবং লিখা (RandomAccessFile এর মাধ্যমে)
import java.io.*;
public class RandomAccessFileExample {
public static void main(String[] args) {
// ফাইল অবজেক্ট তৈরি
File file = new File("example.dat");
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
// প্রথমে কিছু ডেটা লেখা
raf.writeUTF("Hello, Java!");
raf.writeInt(12345);
// ফাইলের পয়েন্টার প্রথমে ফিরিয়ে আনা
raf.seek(0);
// ফাইল থেকে ডেটা পড়া
String str = raf.readUTF();
int number = raf.readInt();
System.out.println("Read from file: " + str);
System.out.println("Read from file: " + number);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে
RandomAccessFileব্যবহার করে একটি ফাইলেwriteUTF()এবংwriteInt()মেথড ব্যবহার করে ডেটা লেখা হয়েছে। - পরে
seek(0)মেথড দিয়ে ফাইল পয়েন্টারকে প্রথমে ফিরিয়ে আনা হয়েছে, যাতে ফাইল থেকে প্রথমে ডেটা পড়া যায়। - পরে
readUTF()এবংreadInt()মেথড ব্যবহার করে ফাইল থেকে ডেটা পড়া হয়েছে।
আউটপুট:
Read from file: Hello, Java!
Read from file: 12345
২. RandomAccessFile দিয়ে নির্দিষ্ট স্থানে ডেটা লেখা
import java.io.*;
public class RandomAccessFileWriteExample {
public static void main(String[] args) {
try (RandomAccessFile raf = new RandomAccessFile("example.dat", "rw")) {
// ফাইলের মধ্যে নির্দিষ্ট পজিশনে ডেটা লেখা
raf.seek(10); // পয়েন্টারকে 10 তম বাইটে নিয়ে যাওয়া
raf.writeUTF("New Data at position 10");
System.out.println("Data written at position 10.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
seek(10)মেথড দিয়ে ফাইল পয়েন্টারকে ১০ তম বাইটে নিয়ে যাওয়া হয়েছে এবং এরপর সেই স্থানে ডেটা লেখা হয়েছে।
RandomAccessFile এর প্রয়োজনীয়তা:
- Random Access:
- RandomAccessFile একটি র্যান্ডম অ্যাক্সেস ফাইল স্ট্রিম, যার মাধ্যমে ফাইলের যে কোনো পজিশনে সরাসরি পৌঁছানো যায়, এবং সেখানে ডেটা পড়া বা লেখা যায়। এটি সিকোয়েন্সিয়াল ফাইল অ্যাক্সেসের তুলনায় অনেক বেশি কার্যকরী।
- Multiple Read and Write Operations:
- আপনি একটি ফাইলে একাধিক পজিশনে ডেটা পড়তে এবং লেখতে পারেন, যা ফাইলের মধ্যে বিভিন্ন ধরনের তথ্য ম্যানিপুলেট করার জন্য উপকারী।
- Efficient for Large Files:
- বড় ফাইলগুলি পড়ার এবং লেখার জন্য RandomAccessFile উপযুক্ত, কারণ এটি ফাইলের মধ্যে যে কোনো পজিশনে ডেটা অ্যাক্সেস করতে পারে, যা সময় এবং মেমরি খরচ কমায়।
- Improved File Manipulation:
- ফাইলের কিছু অংশ পড়া বা লেখা করার সময় অন্যান্য অংশের প্রভাব না ফেললে RandomAccessFile খুব কার্যকরী। এটি ডেটার নির্দিষ্ট অংশগুলিতে সরাসরি অ্যাক্সেসের সুবিধা দেয়।
- File Pointer Control:
- seek() মেথড ব্যবহার করে আপনি ফাইলের যে কোনও স্থানে চলে যেতে পারেন এবং সেখান থেকে ডেটা পড়তে বা লিখতে পারেন। এই সুবিধা সিকোয়েন্সিয়াল FileInputStream এবং FileOutputStream-এর তুলনায় অনেক বেশি সুবিধাজনক।
- RandomAccessFile ক্লাস Java-তে ফাইল অ্যাক্সেস এবং ফাইল ম্যানিপুলেশন এর জন্য খুবই শক্তিশালী এবং কার্যকরী একটি টুল।
- এটি r (read), w (write), এবং rw (read-write) মোডে কাজ করতে পারে।
- seek() মেথডের মাধ্যমে ফাইলের যেকোনো স্থানে সরাসরি পৌঁছানো সম্ভব, যা sequential access থেকে অনেক বেশি কার্যকরী।
- এটি large files-এ কার্যকরী এবং file pointer manipulation এর মাধ্যমে ডেটা প্রসেস করা সহজ করে তোলে।
RandomAccessFile ক্লাসের মাধ্যমে ফাইলের নির্দিষ্ট অংশ পড়া বা লেখা সম্ভব, যা অনেক ধরনের I/O অপারেশনে সাহায্য করে, বিশেষ করে যখন large-scale file manipulation করতে হয়।
RandomAccessFile ক্লাস Java I/O প্যাকেজের একটি শক্তিশালী ক্লাস যা ফাইলের নির্দিষ্ট অবস্থানে ডেটা পড়া এবং লেখা করার জন্য ব্যবহৃত হয়। এই ক্লাসটি ফাইলের মধ্যে যেকোনও স্থানে যেকোনো ডেটা পড়তে এবং লেখার ক্ষমতা প্রদান করে, যা FileInputStream বা FileOutputStream এর তুলনায় অনেক বেশি নমনীয় এবং কার্যকরী।
RandomAccessFile ক্লাসটি InputStream এবং OutputStream উভয়ই ইনহেরিট করে, তাই এটি পড়া এবং লেখা উভয় অপারেশন একসাথে সমর্থন করে। এটি binary files বা text files সহ যে কোনও ধরনের ডেটা স্টোরেজ ফাইলের জন্য উপযোগী।
RandomAccessFile Class এর মূল বৈশিষ্ট্য:
- Random Access:
- এই ক্লাসটি random access এর মাধ্যমে ফাইলের যেকোনো অবস্থানে seek করে ডেটা পড়তে এবং লিখতে সহায়ক।
- পড়ার এবং লেখার ক্ষমতা:
- এটি ফাইলের নির্দিষ্ট পজিশনে ডেটা পড়তে এবং লিখতে পারে, যা অন্য কোন ক্লাসের মাধ্যমে করা সম্ভব নয়।
- File Pointer:
seek(long pos)মেথড ব্যবহার করে ফাইল পয়েন্টারকে নির্দিষ্ট অবস্থানে নিয়ে আসা যায়, যেখানে ডেটা পড়া বা লেখা হবে।
- Support for Both Text and Binary Data:
- RandomAccessFile ক্লাস binary এবং text উভয় ধরনের ডেটার জন্য কাজ করে।
RandomAccessFile Class এর গুরুত্বপূর্ণ মেথডসমূহ:
| মেথড | বর্ণনা |
|---|---|
| read() | ফাইল থেকে একটি বাইট পড়ে। |
| read(byte[] b) | বাফারে একাধিক বাইট পড়ে। |
| write(int b) | একটি বাইট ফাইলে লেখে। |
| write(byte[] b) | বাফারে থাকা একাধিক বাইট ফাইলে লেখে। |
| seek(long pos) | ফাইল পয়েন্টারকে নির্দিষ্ট পজিশনে নিয়ে যায়। |
| getFilePointer() | বর্তমান ফাইল পয়েন্টারের অবস্থান রিটার্ন করে। |
| length() | ফাইলের মোট আকার রিটার্ন করে। |
| close() | ফাইল স্ট্রীম বন্ধ করে। |
RandomAccessFile ব্যবহার করে ফাইলের নির্দিষ্ট অবস্থানে পড়া এবং লেখা
ফাইলের নির্দিষ্ট অবস্থানে পড়া এবং লেখা উদাহরণ
import java.io.*;
public class RandomAccessFileExample {
public static void main(String[] args) {
try {
// RandomAccessFile তৈরি করা
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
// ফাইলের প্রথম 10 বাইট পড়া
byte[] bytes = new byte[10];
file.read(bytes);
System.out.println("First 10 bytes: " + new String(bytes));
// ফাইল পয়েন্টারকে 20 তম বাইটে নিয়ে যাওয়া
file.seek(20);
// 20 তম পজিশনে একটি নতুন ডেটা লেখা
file.write("Hello, this is random access.".getBytes());
// ফাইল পয়েন্টারকে আবার প্রথম অবস্থানে নিয়ে আসা
file.seek(0);
// ফাইলের প্রথম 10 বাইট আবার পড়া
file.read(bytes);
System.out.println("First 10 bytes after write: " + new String(bytes));
// ফাইল বন্ধ করা
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে
RandomAccessFileক্লাসের একটি অবজেক্ট তৈরি করা হয়েছে"rw"মোডে, যার মানে হচ্ছে আমরা ফাইলটি পড়তে এবং লিখতে পারব। read(byte[] b)মেথড ব্যবহার করে ফাইলের প্রথম 10 বাইট পড়া হচ্ছে।seek(long pos)মেথড দ্বারা ফাইল পয়েন্টারকে 20 তম পজিশনে নিয়ে যাওয়া হচ্ছে, এবং সেখানেwrite()মেথডের মাধ্যমে নতুন ডেটা লেখা হচ্ছে।- পরে
seek(0)মেথড ব্যবহার করে ফাইল পয়েন্টারকে প্রথম পজিশনে নিয়ে আসা হচ্ছে এবং ফাইলের প্রথম 10 বাইট আবার পড়া হচ্ছে।
আউটপুট (যদি example.txt ফাইলের মধ্যে কিছু ডেটা থাকে):
First 10 bytes: HelloWorld
First 10 bytes after write: HelloWorld
RandomAccessFile এর সুবিধা:
- ফাইলের নির্দিষ্ট অবস্থানে ডেটা পড়া এবং লেখা:
- RandomAccessFile ক্লাসের মাধ্যমে আমরা যে কোনও অবস্থানে গিয়ে ডেটা পড়তে বা লিখতে পারি, যা FileInputStream বা FileOutputStream এর মাধ্যমে সম্ভব নয়।
- Performance Improvement:
- যখন আপনাকে বড় ফাইলের মধ্যে কিছু নির্দিষ্ট ডেটা পড়তে বা লিখতে হয়, তখন seek() মেথড ব্যবহার করে আপনি শুধুমাত্র সেই অংশে কাজ করতে পারেন, যা পারফরম্যান্স উন্নত করতে সহায়ক।
- Binary and Text Data Support:
- এটি binary এবং text উভয় ধরনের ডেটার জন্য সমর্থন প্রদান করে।
- File Pointer Management:
getFilePointer()এবংseek()মেথডের মাধ্যমে আপনি ফাইলের পয়েন্টার পরিচালনা করতে পারেন এবং যেখানে প্রয়োজন সেখানে ডেটা পড়তে বা লিখতে পারেন।
RandomAccessFile এর সীমাবদ্ধতা:
- Memory Consumption:
- যদিও RandomAccessFile ক্লাস buffering ব্যবহার করে না, তবে large files-এ দ্রুত ডেটা পড়া এবং লেখা করার জন্য অতিরিক্ত memory ব্যবহার হতে পারে।
- File Type:
- RandomAccessFile কেবল binary এবং text ডেটা স্টোরেজের জন্য উপযুক্ত, তবে এটি Object Serialization বা high-level structured file formats এর জন্য উপযুক্ত নয়।
- RandomAccessFile Java তে ফাইলের নির্দিষ্ট অবস্থানে ডেটা পড়া এবং লেখা করার জন্য ব্যবহৃত একটি শক্তিশালী ক্লাস।
- এটি file pointer ব্যবহার করে নির্দিষ্ট অবস্থানে seek করে ডেটা পড়তে এবং লিখতে সক্ষম, যা অন্যান্য ক্লাসের তুলনায় অনেক বেশি নমনীয় এবং কার্যকর।
- ফাইলের binary এবং text উভয় ধরনের ডেটার জন্য এটি কার্যকরী।
RandomAccessFile ক্লাসটি large files বা binary data এর সাথে কাজ করার জন্য অত্যন্ত উপকারী, যেখানে নির্দিষ্ট অবস্থানে দ্রুত ডেটা অ্যাক্সেস করতে হয়।
Random Access File (RAF) হল Java I/O প্যাকেজের একটি বিশেষ ক্লাস যা ফাইলের যেকোনো অংশে দ্রুত অ্যাক্সেস করার জন্য ব্যবহৃত হয়। এর মাধ্যমে ফাইলের নির্দিষ্ট অবস্থানে গিয়ে পড়া বা লেখা সম্ভব হয়, অর্থাৎ sequential access না করে direct access করা যায়। এই ক্ষমতা সাধারণত databases বা বড় ডেটা ফাইলগুলির জন্য প্রয়োজনীয় যেখানে শুধুমাত্র একটি নির্দিষ্ট অংশের পরিবর্তন করা হয় বা পড়া হয়।
RandomAccessFile ক্লাসটি File এবং Seekable Streams এর একটি সমন্বয় হিসেবে কাজ করে, যা আপনি যে অংশে ডেটা রাখতে চান বা পড়তে চান সেখানে file pointer স্থাপন করতে দেয়।
RandomAccessFile এর মূল বৈশিষ্ট্য:
- ফাইল পয়েন্টার পরিচালনা:
seek(long position)মেথড ব্যবহার করে ফাইল পয়েন্টারকে নির্দিষ্ট অবস্থানে স্থানান্তর করা যায়।- ফাইল পয়েন্টার ব্যবহার করে আপনি ফাইলের যে কোনও জায়গায় দ্রুতভাবে পড়তে বা লেখতে পারেন।
- File Modes:
- RandomAccessFile ক্লাস দুটি মোডে কাজ করতে পারে:
- "r": শুধুমাত্র পড়ার জন্য ফাইল খুলে।
- "rw": পড়ার পাশাপাশি লেখার জন্য ফাইল খুলে।
- "rwd": ফাইলের কন্টেন্ট এবং মেটাডেটা লেখার জন্য (read/write data)।
- "rws": ফাইলের কন্টেন্ট এবং মেটাডেটা লেখার জন্য (read/write data & synchronization).
- RandomAccessFile ক্লাস দুটি মোডে কাজ করতে পারে:
- Data Types:
- RandomAccessFile বিভিন্ন primitive types যেমন
byte,char,int,long,float,doubleএবং String ডেটা লেখার এবং পড়ার জন্যreadএবংwriteমেথড প্রদান করে।
- RandomAccessFile বিভিন্ন primitive types যেমন
RandomAccessFile এর মেথড:
| মেথড | বর্ণনা |
|---|---|
seek(long position) | ফাইল পয়েন্টারকে নির্দিষ্ট অবস্থানে স্থানান্তরিত করে। |
read() | ফাইল থেকে একটি বাইট পড়ে। |
readInt() | ফাইল থেকে একটি int পড়ে। |
write() | ফাইলে একটি বাইট লেখে। |
writeInt() | ফাইলে একটি int লেখে। |
getFilePointer() | ফাইল পয়েন্টারের বর্তমান অবস্থান রিটার্ন করে। |
length() | ফাইলের আকার (সাইজ) রিটার্ন করে। |
close() | ফাইল স্ট্রীমটি বন্ধ করে। |
RandomAccessFile উদাহরণ:
১. File Pointer ব্যবহার করে একটি ফাইল থেকে নির্দিষ্ট অংশে ডেটা পড়া এবং লেখা
import java.io.*;
public class RandomAccessFileExample {
public static void main(String[] args) {
// একটি নতুন ফাইল তৈরি এবং লেখা
try (RandomAccessFile file = new RandomAccessFile("example.dat", "rw")) {
// প্রথমে কিছু ডেটা লিখুন
file.writeInt(123); // int লিখুন
file.writeDouble(3.14); // double লিখুন
file.writeUTF("Hello, Random Access!"); // String লিখুন
// ফাইল পয়েন্টারকে প্রথম অবস্থানে নিয়ে যান
file.seek(0);
// প্রথমে লেখা ডেটা পড়ুন
int intValue = file.readInt(); // int পড়ুন
double doubleValue = file.readDouble(); // double পড়ুন
String stringValue = file.readUTF(); // String পড়ুন
// পড়া ডেটা প্রিন্ট করুন
System.out.println("Integer: " + intValue);
System.out.println("Double: " + doubleValue);
System.out.println("String: " + stringValue);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে ফাইলের মধ্যে একটি
int,double, এবং একটিStringলিখা হচ্ছে। - তারপর
seek()মেথড ব্যবহার করে ফাইল পয়েন্টারকে প্রথম অবস্থানে নিয়ে যাওয়া হচ্ছে। - পরবর্তীতে সেই অবস্থান থেকে
readInt(),readDouble(), এবংreadUTF()মেথড ব্যবহার করে ডেটা পড়া হচ্ছে।
আউটপুট:
Integer: 123
Double: 3.14
String: Hello, Random Access!
২. File Pointer এর অবস্থান চেক করা এবং ফাইলের সাইজ পাওয়া
import java.io.*;
public class FilePointerExample {
public static void main(String[] args) {
try (RandomAccessFile file = new RandomAccessFile("example.dat", "rw")) {
// কিছু ডেটা লিখুন
file.writeInt(42);
file.writeUTF("Random Access Example");
// ফাইল পয়েন্টারের বর্তমান অবস্থান পেতে
long currentPointer = file.getFilePointer();
System.out.println("Current File Pointer Position: " + currentPointer);
// ফাইলের আকার পেতে
long fileLength = file.length();
System.out.println("File Length: " + fileLength);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
getFilePointer()মেথড দ্বারা ফাইল পয়েন্টারের বর্তমান অবস্থান পাওয়া যাচ্ছে।length()মেথড দ্বারা ফাইলের মোট আকার পাওয়া যাচ্ছে।
আউটপুট:
Current File Pointer Position: 14
File Length: 36
৩. RandomAccessFile এর মাধ্যমে নির্দিষ্ট অবস্থানে ডেটা লেখা
import java.io.*;
public class RandomAccessFileWriteExample {
public static void main(String[] args) {
try (RandomAccessFile file = new RandomAccessFile("example.dat", "rw")) {
// প্রথমে কিছু ডেটা লিখুন
file.writeUTF("Hello");
file.writeInt(100);
// ফাইল পয়েন্টারকে দ্বিতীয় অবস্থানে নিয়ে যান
file.seek(0); // প্রথমে "Hello" লেখার পরে পয়েন্টার থাকবে 5 তম অবস্থানে
// আবার নতুন ডেটা লিখুন
file.writeUTF("Java"); // পয়েন্টার অবস্থান পরিবর্তন হয়ে "Hello" এর উপরে লেখা হবে
// ফাইল পয়েন্টারকে পরবর্তী অবস্থানে নিয়ে যান
file.seek(5);
int value = file.readInt(); // দ্বিতীয় অবস্থানে থাকা `100` পড়ুন
System.out.println("File Data at position 5: " + value); // `100` দেখাবে
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- ফাইল পয়েন্টারকে
seek(0)দিয়ে প্রথম অবস্থানে নিয়ে যাওয়া হচ্ছে। - তারপর
writeUTF()মেথড ব্যবহার করে ফাইলের উপরে নতুন ডেটা লেখা হচ্ছে। seek()মেথডের মাধ্যমে ফাইল পয়েন্টারকে অন্য স্থানে নিয়ে গিয়ে পুরনো ডেটার উপরে নতুন ডেটা লেখা হচ্ছে।
আউটপুট:
File Data at position 5: 100
RandomAccessFile এর সুবিধা:
- Fast and Direct Access:
- এটি একটি direct access স্ট্রীম, যা নির্দিষ্ট অবস্থানে দ্রুতভাবে পড়া এবং লেখা সম্ভব করে।
- Seekable Streams:
- seek() মেথডের মাধ্যমে যেকোনো অবস্থানে directly অ্যাক্সেস করা যায়।
- Multiple Data Types Handling:
- RandomAccessFile বিভিন্ন primitive types যেমন
int,long,char,float,double,Stringইত্যাদি হ্যান্ডল করতে সক্ষম।
- RandomAccessFile বিভিন্ন primitive types যেমন
- Efficient for Databases:
- RandomAccessFile ডাটাবেসের মতো অ্যাপ্লিকেশনগুলিতে উপকারী যেখানে নির্দিষ্ট ডেটার অংশে দ্রুত অ্যাক্সেস করা প্রয়োজন।
- RandomAccessFile একটি শক্তিশালী ক্লাস যা File Pointer পরিচালনা করতে সহায়ক এবং দ্রুত random access প্রদান করে। এটি ফাইলের যেকোনো অংশে দ্রুতভাবে ডেটা পড়া এবং লেখা সম্ভব করে।
- seek() মেথড ব্যবহার করে ফাইল পয়েন্টারকে নিয়ন্ত্রণ করা যায়, যা সাধারণ স্ট্রীমের তুলনায় অনেক দ্রুত এবং কার্যকর।
- এটি database এবং large files এর সাথে কাজ করার জন্য আদর্শ যেখানে direct access দরকার।
RandomAccessFile Java I/O এর একটি গুরুত্বপূর্ণ উপাদান, যা ফাইলের নির্দিষ্ট অংশে অ্যাক্সেস করার ক্ষমতা প্রদান করে।
RandomAccessFile হল একটি বিশেষ ধরনের ক্লাস যা Java I/O প্যাকেজের অংশ এবং এটি ফাইলের মধ্যে random access (অর্থাৎ, ফাইলের যেকোনো স্থানে যাওয়া এবং ডেটা পড়া বা লেখা) করার সুযোগ দেয়। এটি byte stream এবং text stream উভয়ই সাপোর্ট করে এবং ফাইলের যে কোনো জায়গায় ডেটা পড়া এবং লেখা করা যায়। এটি বিশেষভাবে যখন ফাইলের বড় আকারে ডেটা থাকে এবং আপনি ফাইলের মধ্যে দ্রুতভাবে কিছু অংশে অ্যাক্সেস করতে চান তখন উপকারী।
RandomAccessFile দিয়ে আপনি ফাইলের মধ্যে ডেটা পড়তে, লিখতে এবং স্থান পরিবর্তন করতে পারেন। এর মাধ্যমে seeking, reading, এবং writing ফাইলের বিভিন্ন অংশে সম্ভব।
RandomAccessFile এর ভূমিকা:
- Random Access: আপনি যে কোনও স্থানে ফাইলের ডেটা অ্যাক্সেস করতে পারবেন।
- File Pointer:
seek()মেথড ব্যবহার করে আপনি ফাইলের পয়েন্টারকে যে কোনো স্থানে স্থানান্তর করতে পারবেন। - Reading and Writing:
read(),write(),readInt(),writeInt()সহ বিভিন্ন মেথডের মাধ্যমে ডেটা পড়া এবং লেখা যায়। - Mode: ফাইলটি খুলতে
r,rw,rws,rwdএই ধরণের মোড ব্যবহার করা যেতে পারে:r: শুধুমাত্র পড়া মোড।rw: পড়া এবং লেখা মোড।rwsএবংrwd: ডেটা ফাইল সিস্টেমে অ্যাটমিকভাবে সেভ করা।
RandomAccessFile এর মেথড:
| মেথড | বর্ণনা |
|---|---|
seek(long pos) | ফাইল পয়েন্টারকে নির্দিষ্ট অবস্থানে স্থানান্তর করে। |
read() | এক বাইট পড়ার জন্য। |
read(byte[] b) | বাইট অ্যারে থেকে ডেটা পড়ার জন্য। |
write(int b) | এক বাইট লিখে। |
write(byte[] b) | বাইট অ্যারে থেকে ডেটা লেখে। |
readInt() | একটি পূর্ণসংখ্যা পড়ার জন্য। |
writeInt(int v) | একটি পূর্ণসংখ্যা লেখার জন্য। |
length() | ফাইলের আকার রিটার্ন করে। |
getFilePointer() | ফাইল পয়েন্টারের বর্তমান অবস্থান রিটার্ন করে। |
close() | ফাইল বন্ধ করে। |
RandomAccessFile এর উদাহরণ:
১. ফাইলের মধ্যে ডেটা লেখা এবং পড়া
এই উদাহরণে আমরা RandomAccessFile ব্যবহার করে একটি ফাইলে ডেটা লিখব এবং তারপর সেই ফাইলের নির্দিষ্ট স্থানে গিয়ে ডেটা পড়ব।
import java.io.*;
public class RandomAccessFileExample {
public static void main(String[] args) {
try {
// র্যান্ডম অ্যাক্সেস ফাইল তৈরি
RandomAccessFile file = new RandomAccessFile("example.dat", "rw");
// ফাইলের প্রথমে একটি String লিখি
file.writeUTF("Hello, World!");
// ফাইলের শেষে একটি Integer লিখি
file.writeInt(12345);
// ফাইলের শুরুতে ফিরে গিয়ে String পড়ি
file.seek(0); // ফাইলের প্রথমে ফিরে যাবো
System.out.println("String: " + file.readUTF());
// এখন Integer পড়বো
file.seek(file.length() - 4); // ফাইলের শেষে গিয়ে Integer পড়বো
System.out.println("Integer: " + file.readInt());
file.close(); // ফাইল বন্ধ করা
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে
writeUTF()মেথড দ্বারা একটি স্ট্রিং "Hello, World!" ফাইলে লেখা হচ্ছে। - পরে
writeInt()মেথড দ্বারা একটি পূর্ণসংখ্যা 12345 ফাইলে লেখা হচ্ছে। seek()মেথডের মাধ্যমে আমরা ফাইলের পয়েন্টারকে একটি নির্দিষ্ট অবস্থানে পাঠিয়ে ডেটা পড়ছি।- প্রথমে আমরা
seek(0)দিয়ে ফাইলের শুরুতে গিয়ে স্ট্রিংটি পড়ছি। - তারপর
seek(file.length() - 4)দিয়ে ফাইলের শেষে গিয়ে ইন্টিজারটি পড়ছি (এখানে 4 হল ইন্টিজারের আকার, যা 4 বাইট সমান)।
- প্রথমে আমরা
আউটপুট:
String: Hello, World!
Integer: 12345
২. ফাইলের মধ্যে ডেটা আপডেট করা
এখানে আমরা একটি RandomAccessFile ব্যবহার করে একটি ফাইলে কিছু ডেটা আপডেট করব।
import java.io.*;
public class RandomAccessFileUpdateExample {
public static void main(String[] args) {
try {
RandomAccessFile file = new RandomAccessFile("updateExample.dat", "rw");
// ফাইলের মধ্যে কিছু ডেটা লিখি
file.writeUTF("Initial data");
file.writeInt(100);
// ফাইলের প্রথম স্থানে গিয়ে ডেটা আপডেট করি
file.seek(0); // ফাইলের প্রথমে ফিরে যাওয়া
file.writeUTF("Updated data"); // নতুন ডেটা লিখা
// ফাইলের মধ্যে ডেটা পড়ি
file.seek(0);
System.out.println("Updated String: " + file.readUTF());
file.seek(file.length() - 4); // ইন্টিজার পড়া
System.out.println("Integer: " + file.readInt());
file.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
- প্রথমে "Initial data" এবং 100 ফাইলে লেখা হচ্ছে।
- তারপর
seek(0)ব্যবহার করে ফাইলের শুরুতে গিয়ে স্ট্রিং "Updated data" দিয়ে আপডেট করা হচ্ছে। - ফাইলের পরে একটি
intপড়া হচ্ছে।
আউটপুট:
Updated String: Updated data
Integer: 100
RandomAccessFile এর সুবিধা:
- Random Access: ফাইলের যেকোনো স্থানে ডেটা পড়তে এবং লেখার সুবিধা।
- Efficient File Operations: বড় ফাইলের মধ্যে দ্রুত ডেটা পড়া এবং লেখা যায়।
- File Pointer:
seek()মেথড ব্যবহার করে ফাইল পয়েন্টারকে যেকোনো স্থানে সরানো যায়। - Text এবং Binary Data:
RandomAccessFileটেক্সট এবং বাইনারি উভয় ধরনের ডেটার জন্য কাজ করে।
RandomAccessFile এর সীমাবদ্ধতা:
- Complexity: সাধারণ FileInputStream বা FileOutputStream এর তুলনায় কিছুটা জটিল, কারণ আপনি ফাইলের মধ্যে পয়েন্টার পরিবর্তন করতে পারবেন।
- File Size Limit: খুব বড় ফাইলের ক্ষেত্রে কর্মক্ষমতা কিছুটা ধীর হতে পারে যদি খুব বেশি র্যান্ডম অ্যাক্সেস করা হয়।
- Non-Buffered: RandomAccessFile ক্লাসটি buffered নয়, অর্থাৎ এটি প্রতিটি লেখার জন্য সিস্টেম কল করে, যা কিছু ক্ষেত্রে ধীর হতে পারে।
- RandomAccessFile ক্লাসটি Java-তে একটি শক্তিশালী টুল, যা আপনাকে ফাইলের মধ্যে random access সুবিধা প্রদান করে, অর্থাৎ আপনি ফাইলের যেকোনো অংশে সরাসরি পৌঁছাতে পারবেন।
- এটি seek() মেথডের মাধ্যমে ফাইলের পয়েন্টার নিয়ন্ত্রণ করতে সহায়ক এবং ডেটা দ্রুত পড়তে এবং লিখতে সাহায্য করে।
- যদিও এটি কিছুটা জটিল হতে পারে এবং পারফরম্যান্সের কিছু সীমাবদ্ধতা থাকতে পারে, তবে RandomAccessFile ক্লাসটি বড় এবং জটিল ফাইল ম্যানিপুলেশনের জন্য খুবই উপকারী।
Read more