"Hej, Amigo!"

"Hej Bilaabo! Hvordan er livet?"

"Fint. I går forsøgte jeg at slippe af med nogle parasitter, men indtil videre har jeg ikke haft den store succes. Og så måtte jeg overnatte i skraldespanden igen."

"Så... er alt stadig godt?"

"Du kunne sige det."

"Godt. Så hvad har du til mig i dag?"

"I dag vil jeg fortælle dig om klassen RandomAccessFile ."

RandomAccessFile osv. - 1

"Sagen er, at FileInputStream og FileOutputStream repræsenterer filer som streams: du kan kun læse og skrive til dem sekventielt."

"Det er ikke altid super bekvemt. Nogle gange skal du skrive et par linjer midt i en fil eller læse et par sider tekst fra slutningen af ​​en multi-megabyte fil. Det ville ikke være særlig effektivt at læse hele filen for disse opgaver."

" RandomAccessFile- klassen blev oprettet for at løse dette problem. Du kan bruge den til at skrive hvor som helst i filen, læse fra den, samt læse og skrive til filen på samme tid."

"Hvor interessant!"

"Jep. Det er faktisk ret praktisk."

"Men hvordan læser man fra et vilkårligt sted?"

"Det hele er ret simpelt. Forestil dig, at du har en teksteditor, som f.eks. Notesblok, åben. Den har en markør. Når du skriver noget, føjes teksten til, hvor markøren er. Læsning af en fil er den samme. Læsning starter fra kl. uanset hvor 'markøren' er. Når du læser/skriver, flytter markøren sig automatisk."

"Her er det bedre at vise dig et eksempel:"

Læsning af 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 eksempel vil jeg gerne henlede din opmærksomhed på to ting:"

"Først oprettelsen af ​​RandomAccessFile- objektet. Det andet argument er bogstavet r. Det betyder, at filen åbnes for læsning ( r - read ). Hvis du vil åbne en fil til læsning og skrivning, skal du bestå « rw » til konstruktøren, i stedet for bare « r ».

"For det andet, se på søgemetoden. Du kan bruge denne metode til at springe rundt i filen og ændre markørpositionen for den aktuelle læse/skrive-handling. Når en fil først åbnes, sættes markøren til den 0. byte. Eller, mere præcist, før den nulte byte."

"Forstod jeg det rigtigt? Vi åbner filen, og markøren er helt i begyndelsen - i position 0. Så kalder vi søgning og flytter markøren til den 100. byte. Og når vi kalder readLine , begynder den at læse fra den hundrede byte . Højre?"

"Ja. Men jeg vil gerne henlede din opmærksomhed på, at søgemetoden giver dig mulighed for at springe vilkårligt rundt i filen. For eksempel:"

Læsning af 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 eksempel læser vi først en linje, der starter ved den 0. byte. Derefter hopper vi til den hundrede byte og læser en linje der. Så hoppede vi til den 0. byte igen og læste en linje. Det betyder, at tekst1 og tekst3 er identiske strenge."

"Ah. Det gør tingene klarere."

"Fantastisk. Så er her et andet eksempel:"

Læsning af 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 åbner vi filen til læsning og skrivning ved at videregive « rw » ( læs/skriv ) til konstruktøren."

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

"Så flytter vi markøren til den 8. byte (som tilfældigvis er begyndelsen af ​​ordet 'streng')"

"Så skriver vi " overraskelse !"

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

"Så bytes indsættes ikke i midten af ​​filen, men erstatter snarere dem, der var der?"

"Ja."

"Hvad nu hvis vi flytter markøren til slutningen af ​​filen?"

"Så bliver bytes skrevet til ende, og filen bliver større. Så det ville næsten være som at skrive tekst ind i en teksteditor."

"Hmm. Jeg tror, ​​jeg forstår alt. Kan du give en komplet liste over RandomAccessFile- klassens metoder?"

"Selvfølgelig. Her går du:"

Metode Beskrivelse
int read() Læser en byte og returnerer den
int read(byte b[], int off, int len) Læser et array af bytes
int read(byte b[]) Læser et array af bytes
void readFully(byte b[]) Læser et array af bytes og venter på, at nye bytes tilføjes, hvis der ikke er nok af dem til at fylde arrayet
int skipBytes(int n) Spring n bytes over. Med andre ord, dette flytter markøren n bytes frem.
void write(int b) Skriver en byte til markørens placering
void write(byte b[]) Skriver en række bytes til markørens placering
void write(byte b[], int off, int len) Skriver en række bytes til markørens placering
long getFilePointer() Returnerer nummeret på den byte, som markøren peger på. Det kan variere fra 0 til fillængden
void seek(long pos) Flytter «markøren», der bruges til at læse/skrive, til det angivne sted
long length() Returnerer filens længde
void setLength(long newLength) Indstiller en ny fillængde. Hvis filen var større, bliver den afkortet; hvis det var mindre, så udvider det filen og udfylder det nye rum med nuller
void close() Lukker filen
boolean readBoolean() Læser en boolsk værdi fra markørens aktuelle position i filen
byte readByte() Læser en byte fra markørens aktuelle position i filen
char readChar() Læser et tegn fra markørens aktuelle position i filen
int readInt() Læser en int fra markørens aktuelle position i filen
long readLong() Læser en lang fra markørens aktuelle position i filen
float readFloat() Læser en flyder fra markørens aktuelle position i filen
double readDouble() Læser en dobbelt fra markørens aktuelle position i filen
String readLine() Læser en linje fra filen og returnerer den
void writeBoolean(boolean v) Skriver en boolean til filen (startende fra markørens position)
void writeByte(int v) t Skriver en byte til filen (startende fra markørens position)
void writeChar(int v) Skriver et tegn til filen (startende fra markørens position)
void writeInt(int v) Skriver en int til filen (startende fra markørens position)
void writeLong(long v) Skriver en lang til filen (startende fra markørens position)
void writeFloat(float v) Skriver en flyder til filen (startende fra markørens position)
void writeDouble(double v) Skriver en dobbelt til filen (startende fra markørens position)
void writeBytes(String s) Skriver en streng til filen (startende fra markørens position)
void writeChars(String s) Skriver en streng til filen (startende fra markørens position)

"Hmm. Så der er ikke noget nyt her. Undtagen måske metodeparrene seek()/getFilePointer() og length()/setLength().

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

"Det er praktisk. Tak, Bilaabo, for en interessant lektion og for de eksempler, du gav mig."

"Glad at hjælpe, Amigo, min ven!"