"Hei, Amigo!"

"Hei, Bilaabo! Hvordan er livet?"

"Flott. I går prøvde jeg å bli kvitt noen parasitter, men så langt har jeg ikke hatt så mye suksess. Og så måtte jeg overnatte i søppeldunken igjen."

"Så... er alt fortsatt bra?"

"Du kan si det."

"Bra. Så hva har du til meg i dag?"

"I dag skal jeg fortelle deg om RandomAccessFile- klassen."

RandomAccessFile, etc. - 1

"Tingen er at FileInputStream og FileOutputStream representerer filer som strømmer: du kan bare lese og skrive til dem sekvensielt."

"Det er ikke alltid veldig praktisk. Noen ganger må du skrive et par linjer midt i en fil, eller lese et par sider med tekst fra slutten av en multi-megabyte fil. Det ville ikke vært veldig effektivt å lese hele filen for disse oppgavene."

" RandomAccessFile- klassen ble opprettet for å løse dette problemet. Du kan bruke den til å skrive hvor som helst i filen, lese fra den, samt lese og skrive til filen samtidig."

"Hvor interessant!"

"Jepp. Det er faktisk ganske praktisk."

"Men hvordan leser du fra et vilkårlig sted?"

"Det hele er ganske enkelt. Tenk deg at du har et tekstredigeringsprogram, for eksempel Notisblokk, åpent. Det har en markør. Når du skriver noe, blir teksten lagt til der markøren er. Å lese en fil er den samme. Lesing starter fra kl. uansett hvor 'markøren' er. Når du leser/skriver, beveger markøren seg automatisk."

"Her er det bedre å vise deg et eksempel:"

Lese en fil:
// 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();

"I dette eksemplet vil jeg gjøre deg oppmerksom på to ting:"

"Først opprettelsen av RandomAccessFile- objektet. Det andre argumentet er bokstaven r. Dette betyr at filen åpnes for lesing ( r - read ). Hvis du vil åpne en fil for lesing og skriving, må du bestå « rw » til konstruktøren, i stedet for bare « r ».

"For det andre, se på søkemetoden. Du kan bruke denne metoden til å hoppe rundt filen og endre markørposisjonen for gjeldende lese-/skriveoperasjon. Når en fil først åpnes, settes markøren til 0. byte. Eller, mer nøyaktig, før null byte."

"Forsto jeg det riktig? Vi åpner filen, og markøren er helt i begynnelsen - i posisjon 0. Deretter kaller vi søk og flytter markøren til den 100. byten. Og når vi kaller readLine , begynner den å lese fra den hundrede byten . Ikke sant?"

"Ja. Men jeg vil gjøre deg oppmerksom på det faktum at søkemetoden lar deg hoppe vilkårlig rundt i filen. For eksempel:"

Lese en fil:
// 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();

"I dette eksemplet leser vi først en linje som starter på 0. byte. Deretter hopper vi til hundrede byte og leser en linje der. Så hoppet vi til 0. byte igjen og leste en linje. Det betyr at tekst1 og tekst3 er identiske strenger."

"Ah. Det gjør ting klarere."

"Flott. Så her er et annet eksempel:"

Lese en fil:
// 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();

"Her åpner vi filen for lesing og skriving ved å sende « rw » ( les/skriv ) til konstruktøren."

"Så skriver vi « Det er en streng » til filen.

"Så flytter vi markøren til den åttende byte (som tilfeldigvis er begynnelsen på ordet 'streng')"

«Så skriver vi « overraskelse !»»

"Som et resultat inneholder filen « Det er en overraskelse !»"

"Så, bytes settes ikke inn i midten av filen, men erstatter heller de som var der?"

"Japp."

"Hva om vi flytter markøren helt til slutten av filen?"

"Da vil bytene bli skrevet til slutten, og filen blir større. Så det ville vært nesten som å skrive tekst inn i et tekstredigeringsprogram."

"Hmm. Jeg tror jeg forstår alt. Kan du gi en fullstendig liste over RandomAccessFile- klassens metoder?"

"Klart. Vær så god:"

Metode Beskrivelse
int read() Leser én byte og returnerer den
int read(byte b[], int off, int len) Leser en rekke byte
int read(byte b[]) Leser en rekke byte
void readFully(byte b[]) Leser en rekke byte, og venter på at nye byte legges til hvis det ikke er nok av dem til å fylle matrisen
int skipBytes(int n) Hopp over n byte. Med andre ord, dette flytter markøren fremover n byte.
void write(int b) Skriver én byte til markørens plassering
void write(byte b[]) Skriver en rekke byte til markørens plassering
void write(byte b[], int off, int len) Skriver en rekke byte til markørens plassering
long getFilePointer() Returnerer nummeret på byten som markøren peker på. Det kan variere fra 0 til fillengden
void seek(long pos) Flytter «markøren» som brukes for lesing/skriving til det angitte stedet
long length() Returnerer fillengden
void setLength(long newLength) Angir en ny fillengde. Hvis filen var større, blir den avkortet; hvis den var mindre, utvider den filen og fyller ut det nye rommet med nuller
void close() Lukker filen
boolean readBoolean() Leser en boolsk fra markørens gjeldende posisjon i filen
byte readByte() Leser en byte fra markørens gjeldende posisjon i filen
char readChar() Leser et tegn fra markørens nåværende posisjon i filen
int readInt() Leser en int fra markørens gjeldende posisjon i filen
long readLong() Leser en lang fra markørens nåværende posisjon i filen
float readFloat() Leser en flyte fra markørens gjeldende posisjon i filen
double readDouble() Leser en dobbel fra markørens nåværende posisjon i filen
String readLine() Leser en linje fra filen og returnerer den
void writeBoolean(boolean v) Skriver en boolsk til filen (starter fra markørens posisjon)
void writeByte(int v) t Skriver en byte til filen (starter fra markørens posisjon)
void writeChar(int v) Skriver et tegn til filen (starter fra markørens posisjon)
void writeInt(int v) Skriver en int til filen (starter fra markørens posisjon)
void writeLong(long v) Skriver en lang til filen (starter fra markørens posisjon)
void writeFloat(float v) Skriver en flyte til filen (starter fra markørens posisjon)
void writeDouble(double v) Skriver en dobbel til filen (starter fra markørens posisjon)
void writeBytes(String s) Skriver en streng til filen (starter fra markørens posisjon)
void writeChars(String s) Skriver en streng til filen (starter fra markørens posisjon)

"Hmm. Så, det er ikke noe nytt her. Bortsett fra kanskje metodeparene seek()/getFilePointer() og length()/setLength().

"Ja, Amigo. Alt er omtrent det samme. Men er det ikke praktisk?"

"Det er praktisk. Takk, Bilaabo, for en interessant leksjon og for eksemplene du ga meg."

"Glad til å hjelpe, Amigo, min venn!"