"हाय, अमिगो!"

"हाय, बिलाबो! आयुष्य कसं आहे?"

"छान. काल, मी काही परजीवीपासून मुक्त होण्याचा प्रयत्न केला, पण आतापर्यंत मला फारसे यश मिळाले नाही. आणि मग मला पुन्हा कचराकुंडीत रात्र काढावी लागली."

"मग... अजूनही सगळं छान आहे का?"

"तू तसे म्हणू शकतो."

"चांगले. मग आज तुझ्याकडे माझ्यासाठी काय आहे?"

"आज मी तुम्हाला RandomAccessFile वर्गाबद्दल सांगेन ."

RandomAccessFile, इ. - १

"गोष्ट अशी आहे की, FileInputStream आणि FileOutputStream फाईल्सचे प्रवाह म्हणून प्रतिनिधित्व करतात: तुम्ही त्यांना फक्त क्रमाने वाचू आणि लिहू शकता."

"ते नेहमीच अतिशय सोयीचे नसते. काहीवेळा तुम्हाला फाइलच्या मध्यभागी दोन ओळी लिहिण्याची किंवा मल्टी-मेगाबाइट फाइलच्या शेवटी मजकूराची दोन पाने वाचण्याची आवश्यकता असते. ते वाचणे फारसे कार्यक्षम नसते. या कामांसाठी संपूर्ण फाइल."

" या समस्येचे निराकरण करण्यासाठी RandomAccessFile क्लास तयार करण्यात आला आहे. तुम्ही फाइलमध्ये कुठेही लिहिण्यासाठी, त्यातून वाचण्यासाठी, तसेच त्याच वेळी फाइलवर वाचण्यासाठी आणि लिहिण्यासाठी याचा वापर करू शकता."

"किती मनोरंजक!"

"हो. खरं तर खूप सोयीस्कर आहे."

"पण तुम्ही एका अनियंत्रित स्थानावरून कसे वाचता?"

"हे सर्व अगदी सोपे आहे. कल्पना करा की तुमच्याकडे नोटपॅड सारखे टेक्स्ट एडिटर उघडले आहे. त्यात कर्सर आहे. तुम्ही काहीतरी टाइप करता तेव्हा, कर्सर जिथे असेल तिथे मजकूर जोडला जातो. फाइल वाचणे सारखेच असते. वाचन सुरू होते. 'कर्सर' कुठेही आहे. वाचताना/लिहिताना, कर्सर आपोआप हलतो."

"येथे, तुम्हाला एक उदाहरण दाखवणे चांगले होईल:"

फाइल वाचणे:
// r - read, the file is opened only for reading.
RandomAccessFile raf = new RandomAccessFile("input.txt", "r");

// Move the «cursor» to the 100th character.
raf.seek(100);

// Read the line starting from the current cursor position until the end of the line.
String text = raf.readLine();

// Close the file.
raf.close();

"या उदाहरणात, मी तुमचे लक्ष दोन गोष्टींकडे आकर्षित करू इच्छितो:"

"प्रथम, RandomAccessFile ऑब्जेक्टची निर्मिती . दुसरा युक्तिवाद म्हणजे अक्षर r. याचा अर्थ फाईल वाचनासाठी उघडली गेली आहे ( r - read ). तुम्हाला वाचन आणि लेखनासाठी फाइल उघडायची असल्यास, तुम्हाला पास करणे आवश्यक आहे « rw » कन्स्ट्रक्टरला, फक्त « r » ऐवजी.

"दुसरे, शोध पद्धत पहा. तुम्ही या पद्धतीचा वापर फाइलभोवती उडी मारण्यासाठी आणि वर्तमान वाचन/लेखन ऑपरेशनसाठी कर्सरची स्थिती बदलण्यासाठी करू शकता. जेव्हा फाइल प्रथम उघडली जाते, तेव्हा कर्सर 0व्या बाइटवर सेट केला जातो. किंवा, अधिक अचूकपणे, झिरोथ बाइटच्या आधी."

"मला बरोबर समजले का? आम्ही फाईल उघडतो, आणि कर्सर अगदी सुरवातीला आहे — 0 स्थानावर. मग आम्ही शोध म्हणतो आणि कर्सरला 100 व्या बाइटवर हलवतो. आणि जेव्हा आपण रीडलाइनला कॉल करतो , तेव्हा ते शंभरव्या बाइटपासून वाचण्यास सुरुवात होते. बरोबर?"

"हो. पण मी या वस्तुस्थितीकडे तुमचे लक्ष वेधून घेऊ इच्छितो की शोध पद्धत तुम्हाला फाईलभोवती अनियंत्रितपणे उडी मारण्याची परवानगी देते. उदाहरणार्थ:"

फाइल वाचणे:
// r - read, the file is opened only for reading.
RandomAccessFile raf = new RandomAccessFile("input.txt", "r");

// The "cursor" is at the 0th character.
String text1 = raf.readLine();

// Move the "cursor" to the 100th character.
raf.seek(100);
String text2 = raf.readLine();

// Move the "cursor" to the 0th character.
raf.seek(0);
String text3 = raf.readLine();

// Close the file
raf.close();

"या उदाहरणात, आपण प्रथम 0व्या बाइटपासून सुरू होणारी एक ओळ वाचतो. नंतर आपण शंभरव्या बाइटवर उडी मारतो आणि तेथे एक ओळ वाचतो. नंतर आपण पुन्हा 0व्या बाइटवर उडी मारली आणि एक ओळ वाचतो. याचा अर्थ असा की मजकूर 1 आणि मजकूर 3 एकसारखे आहेत. तार."

"अहो. त्यामुळे गोष्टी स्पष्ट होतात."

"छान. मग हे दुसरे उदाहरण आहे:"

फाइल वाचणे:
// rw - read/write, the file is opened for reading and writing.
RandomAccessFile raf = new RandomAccessFile("seek.txt", "rw");

// Write to the file, starting from the 0th byte.
raf.writeBytes("It is a string");

// Move the "cursor" to the 8th character.
raf.seek(8);

// Write "surprise!" to the file.
raf.writeBytes("surprise!");

// Close the file.
raf.close();

"येथे आम्ही कन्स्ट्रक्टरला « rw » ( read/write ) पास करून वाचन आणि लेखनासाठी फाइल उघडतो ."

"मग आपण फाईलवर « It is a string » लिहू.

"मग आपण कर्सरला 8व्या बाइटवर हलवतो (जे 'स्ट्रिंग' शब्दाची सुरूवात होते)"

"मग आम्ही लिहू « आश्चर्य !"

"परिणामी, फाइलमध्ये « हे एक आश्चर्य आहे !" समाविष्ट आहे.

"म्हणून, फाईलच्या मध्यभागी बाइट्स घातल्या जात नाहीत, तर त्याऐवजी ते तिथे होते?"

"हो."

"जर आपण कर्सर फाईलच्या अगदी शेवटी हलवला तर?"

"मग बाइट्स शेवटी लिहिल्या जातील, आणि फाइल मोठी होईल. त्यामुळे हे जवळजवळ मजकूर संपादकात मजकूर लिहिल्यासारखे होईल."

"हम्म. मला वाटते की मला सर्व काही समजले आहे. तुम्ही RandomAccessFile क्लासच्या पद्धतींची संपूर्ण यादी देऊ शकता का ?"

"नक्की. इथे जा:"

पद्धत वर्णन
int read() एक बाइट वाचतो आणि परत करतो
int read(byte b[], int off, int len) बाइट्सचा अ‍ॅरे वाचतो
int read(byte b[]) बाइट्सचा अ‍ॅरे वाचतो
void readFully(byte b[]) बाइट्सचा अ‍ॅरे वाचतो आणि अ‍ॅरे भरण्यासाठी पुरेसे नसल्यास नवीन बाइट जोडले जाण्याची प्रतीक्षा करते
int skipBytes(int n) n बाइट्स वगळा. दुसऱ्या शब्दांत, हे कर्सर n बाइट्स पुढे हलवते.
void write(int b) कर्सरच्या स्थानावर एक बाइट लिहितो
void write(byte b[]) कर्सरच्या स्थानावर बाइट्सचा अ‍ॅरे लिहितो
void write(byte b[], int off, int len) कर्सरच्या स्थानावर बाइट्सचा अ‍ॅरे लिहितो
long getFilePointer() कर्सर दिग्दर्शित करत असलेल्या बाइटची संख्या मिळवते. ते 0 ते फाइल लांबीपर्यंत असू शकते
void seek(long pos) वाचन/लेखनासाठी वापरलेला «कर्सर» निर्दिष्ट ठिकाणी हलवतो
long length() फाइलची लांबी मिळवते
void setLength(long newLength) नवीन फाइल लांबी सेट करते. फाईल मोठी असल्यास, ती कापली जाते; जर ते लहान असेल तर ते फाईल विस्तृत करते आणि शून्यासह नवीन जागा भरते
void close() फाईल बंद करते
boolean readBoolean() फाइलमधील कर्सरच्या वर्तमान स्थितीवरून बुलियन वाचते
byte readByte() फाइलमधील कर्सरच्या वर्तमान स्थितीवरून एक बाइट वाचते
char readChar() फाइलमधील कर्सरच्या वर्तमान स्थितीवरून एक वर्ण वाचतो
int readInt() फाईलमधील कर्सरच्या वर्तमान स्थितीवरून एक इंट वाचतो
long readLong() फाईलमधील कर्सरच्या वर्तमान स्थितीपासून लांब वाचतो
float readFloat() फाइलमधील कर्सरच्या वर्तमान स्थितीवरून फ्लोट वाचते
double readDouble() फाइलमधील कर्सरच्या वर्तमान स्थितीपासून दुहेरी वाचते
String readLine() फाईलमधील एक ओळ वाचते आणि ती परत करते
void writeBoolean(boolean v) फाइलवर बुलियन लिहिते (कर्सरच्या स्थितीपासून सुरू होणारे)
void writeByte(int v) t फाइलवर एक बाइट लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeChar(int v) फाइलवर एक वर्ण लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeInt(int v) फाइलवर एक इंट लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeLong(long v) फाईलवर लांब लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeFloat(float v) फाइलवर फ्लोट लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeDouble(double v) फाइलवर दुहेरी लिहितो (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeBytes(String s) फाइलवर स्ट्रिंग लिहिते (कर्सरच्या स्थितीपासून सुरू होणारी)
void writeChars(String s) फाइलवर स्ट्रिंग लिहिते (कर्सरच्या स्थितीपासून सुरू होणारी)

"हम्म. तर, इथे नवीन काहीही नाही. कदाचित seek()/getFilePointer() आणि length()/setLength() मेथड जोड्या वगळता."

"हो, अमिगो. सर्व काही सारखेच आहे. पण ते सोयीचे नाही का?"

"हे सोयीचे आहे. बिलाबो, एका मनोरंजक धड्याबद्दल आणि तुम्ही मला दिलेल्या उदाहरणांसाठी धन्यवाद."

"मदत करण्यात आनंद झाला, अमिगो, माझा मित्र!"