"Hi, Amigo!"

"Hi, Bilaabo! Kamusta ang buhay?"

"Great. Kahapon, sinubukan kong tanggalin ang ilang mga parasito, ngunit hanggang ngayon ay wala pa akong gaanong tagumpay. At pagkatapos ay kailangan kong magpalipas muli ng gabi sa basurahan."

"So... maganda pa ba ang lahat?"

"Masasabi mo yan."

"Good. So anong meron ka sa akin ngayon?"

"Ngayon sasabihin ko sa iyo ang tungkol sa klase ng RandomAccessFile ."

RandomAccessFile, atbp. - 1

"Ang bagay ay, ang FileInputStream at FileOutputStream ay kumakatawan sa mga file bilang mga stream: maaari mo lamang basahin at isulat ang mga ito nang sunud-sunod."

"Iyan ay hindi palaging sobrang maginhawa. Minsan kailangan mong magsulat ng ilang linya sa gitna ng isang file, o magbasa ng ilang mga pahina ng teksto mula sa dulo ng isang multi-megabyte na file. Hindi ito magiging mahusay na basahin ang buong file para sa mga gawaing ito."

"Ang klase ng RandomAccessFile ay nilikha upang malutas ang problemang ito. Magagamit mo ito upang magsulat kahit saan sa file, magbasa mula dito, pati na rin basahin at isulat sa file nang sabay-sabay."

"Kawili-wili!"

"Yep. It's actually quite convenient."

"Ngunit paano ka nagbabasa mula sa isang arbitrary na lokasyon?"

"Medyo simple ang lahat. Isipin na mayroon kang isang text editor, tulad ng Notepad, na bukas. Ito ay may cursor. Kapag nag-type ka ng isang bagay, ang teksto ay idinaragdag sa kung nasaan man ang cursor. Ang pagbabasa ng isang file ay pareho. Ang pagbabasa ay nagsisimula sa kung nasaan man ang 'cursor'. Kapag nagbabasa/nagsusulat, awtomatikong gumagalaw ang cursor."

"Narito, mas mabuting magpakita sa iyo ng isang halimbawa:"

Pagbabasa ng file:
// 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();

"Sa halimbawang ito, gusto kong ituon ang iyong pansin sa dalawang bagay:"

"Una, ang paglikha ng RandomAccessFile object. Ang pangalawang argumento ay ang letrang r. Nangangahulugan ito na ang file ay binuksan para sa pagbabasa ( r - read ). Kung gusto mong magbukas ng file para sa pagbabasa at pagsulat, kailangan mong ipasa ang « rw » sa constructor, sa halip na « r » lang."

"Pangalawa, tingnan ang paraan ng paghahanap. Magagamit mo ang paraang ito para tumalon sa file at baguhin ang posisyon ng cursor para sa kasalukuyang operasyon ng read/write. Kapag unang binuksan ang isang file, nakatakda ang cursor sa ika-0 byte. O kaya, mas tumpak, bago ang zeroth byte."

"Naintindihan ko ba nang tama? Binuksan namin ang file, at ang cursor ay nasa pinakadulo simula — sa posisyon 0. Pagkatapos ay tinatawagan namin ang paghahanap at ilipat ang cursor sa ika-100 byte. At kapag tinawag namin ang readLine , magsisimula itong magbasa mula sa ika-100 byte. . Tama?"

"Oo. Ngunit gusto kong ituon ang iyong pansin sa katotohanan na ang paraan ng paghahanap ay nagbibigay-daan sa iyo na arbitraryong tumalon sa paligid ng file. Halimbawa:"

Pagbabasa ng file:
// 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();

"Sa halimbawang ito, una kaming nagbasa ng isang linya na nagsisimula sa ika-0 na byte. Pagkatapos ay tumalon kami sa ika-daang byte at nagbasa ng isang linya doon. Pagkatapos ay tumalon kami muli sa ika-0 na byte at nagbasa ng isang linya. Nangangahulugan iyon na ang text1 at text3 ay magkapareho mga string."

"Ah. Mas nagpapalinaw yan."

"Mahusay. Pagkatapos ay narito ang isa pang halimbawa:"

Pagbabasa ng file:
// 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();

"Dito namin binubuksan ang file para sa pagbabasa at pagsusulat sa pamamagitan ng pagpasa ng « rw » ( read/write ) sa constructor."

"Pagkatapos ay isusulat namin ang « Ito ay isang string » sa file.

"Pagkatapos ay inililipat namin ang cursor sa ika-8 byte (na nangyayari na ang simula ng salitang 'string')"

"Pagkatapos ay sumulat kami ng « sorpresa !""

"Bilang resulta, ang file ay naglalaman ng « Ito ay isang sorpresa !»"

"Kaya, ang mga byte ay hindi ipinasok sa gitna ng file, ngunit pinapalitan nila ang mga nandoon?"

"Oo."

"Paano kung ilipat natin ang cursor sa pinakadulo ng file?"

"Pagkatapos ang mga byte ay isusulat hanggang sa dulo, at ang file ay lalago. Kaya ito ay halos tulad ng pagsulat ng teksto sa isang text editor."

"Hmm. Sa tingin ko naiintindihan ko ang lahat. Puwede ka bang magbigay ng kumpletong listahan ng mga pamamaraan ng klase ng RandomAccessFile ?"

"Oo naman. Heto:"

Pamamaraan Paglalarawan
int read() Nagbabasa ng isang byte at ibinabalik ito
int read(byte b[], int off, int len) Nagbabasa ng hanay ng mga byte
int read(byte b[]) Nagbabasa ng hanay ng mga byte
void readFully(byte b[]) Nagbabasa ng hanay ng mga byte, at naghihintay para sa mga bagong byte na maidagdag kung hindi sapat ang mga ito upang punan ang array
int skipBytes(int n) Laktawan ang n bytes. Sa madaling salita, inililipat nito ang cursor pasulong n bytes.
void write(int b) Sumulat ng isang byte sa lokasyon ng cursor
void write(byte b[]) Nagsusulat ng hanay ng mga byte sa lokasyon ng cursor
void write(byte b[], int off, int len) Nagsusulat ng hanay ng mga byte sa lokasyon ng cursor
long getFilePointer() Ibinabalik ang bilang ng byte na itinuturo ng cursor. Maaari itong mula sa 0 hanggang sa haba ng file
void seek(long pos) Inilipat ang «cursor» na ginagamit para sa pagbabasa/pagsusulat sa tinukoy na lokasyon
long length() Ibinabalik ang haba ng file
void setLength(long newLength) Nagtatakda ng bagong haba ng file. Kung ang file ay mas malaki, ito ay mapuputol; kung ito ay mas maliit, pagkatapos ay pinalawak nito ang file at pinupuno ang bagong puwang ng mga zero
void close() Isinasara ang file
boolean readBoolean() Nagbabasa ng boolean mula sa kasalukuyang posisyon ng cursor sa file
byte readByte() Nagbabasa ng isang byte mula sa kasalukuyang posisyon ng cursor sa file
char readChar() Nagbabasa ng char mula sa kasalukuyang posisyon ng cursor sa file
int readInt() Nagbabasa ng int mula sa kasalukuyang posisyon ng cursor sa file
long readLong() Nagbabasa ng mahabang panahon mula sa kasalukuyang posisyon ng cursor sa file
float readFloat() Nagbabasa ng float mula sa kasalukuyang posisyon ng cursor sa file
double readDouble() Nagbabasa ng doble mula sa kasalukuyang posisyon ng cursor sa file
String readLine() Nagbabasa ng linya mula sa file at ibinabalik ito
void writeBoolean(boolean v) Nagsusulat ng boolean sa file (nagsisimula sa posisyon ng cursor)
void writeByte(int v) t Sumulat ng isang byte sa file (nagsisimula sa posisyon ng cursor)
void writeChar(int v) Nagsusulat ng char sa file (nagsisimula sa posisyon ng cursor)
void writeInt(int v) Nagsusulat ng int sa file (nagsisimula sa posisyon ng cursor)
void writeLong(long v) Sumulat ng mahaba sa file (nagsisimula sa posisyon ng cursor)
void writeFloat(float v) Nagsusulat ng float sa file (nagsisimula sa posisyon ng cursor)
void writeDouble(double v) Nagsusulat ng doble sa file (nagsisimula sa posisyon ng cursor)
void writeBytes(String s) Nagsusulat ng String sa file (nagsisimula sa posisyon ng cursor)
void writeChars(String s) Nagsusulat ng String sa file (nagsisimula sa posisyon ng cursor)

"Hmm. Kaya, walang bago dito. Maliban na lang siguro ang seek()/getFilePointer() at length()/setLength() method pairs."

"Oo, Amigo. Halos pare-pareho lang ang lahat. Pero hindi ba convenient?"

"Ito ay maginhawa. Salamat, Bilaabo, para sa isang kawili-wiling aral at para sa mga halimbawang ibinigay mo sa akin."

"Natutuwa akong tumulong, Amigo, aking kaibigan!"