"Hai, Amigo!"

"Hai, Bilaabo! Bagaimana hidup?"

"Bagus. Kemarin, saya mencoba menyingkirkan beberapa parasit, tetapi sejauh ini saya belum berhasil. Dan kemudian saya harus bermalam di tong sampah lagi."

"Jadi ... apakah semuanya masih bagus?"

"Kamu bisa mengatakan itu."

"Bagus. Jadi apa yang kamu punya untukku hari ini?"

"Hari ini saya akan memberi tahu Anda tentang kelas RandomAccessFile ."

RandomAccessFile, dll. - 1

"Masalahnya, FileInputStream dan FileOutputStream merepresentasikan file sebagai aliran: Anda hanya dapat membaca dan menulisnya secara berurutan."

"Itu tidak selalu sangat nyaman. Terkadang Anda perlu menulis beberapa baris di tengah file, atau membaca beberapa halaman teks dari akhir file multi-megabyte. Tidak akan efisien untuk membaca seluruh file untuk tugas-tugas ini."

" Kelas RandomAccessFile dibuat untuk mengatasi masalah ini. Anda dapat menggunakannya untuk menulis di mana saja dalam file, membaca darinya, serta membaca dan menulis ke file pada saat yang bersamaan."

"Sangat menarik!"

"Ya. Sebenarnya cukup nyaman."

"Tapi bagaimana Anda membaca dari lokasi yang sewenang-wenang?"

"Semuanya sangat sederhana. Bayangkan Anda memiliki editor teks, seperti Notepad, buka. Ia memiliki kursor. Saat Anda mengetik sesuatu, teks ditambahkan ke mana pun kursor berada. Membaca file sama saja. Membaca dimulai dari di mana pun 'kursor' berada. Saat membaca/menulis, kursor bergerak secara otomatis."

"Ini, akan lebih baik untuk menunjukkanmu sebuah contoh:"

Membaca 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();

"Dalam contoh ini, saya ingin menarik perhatian Anda pada dua hal:"

"Pertama, pembuatan objek RandomAccessFile . Argumen kedua adalah huruf r. Artinya file dibuka untuk dibaca ( r - read ). Jika Anda ingin membuka file untuk membaca dan menulis, Anda harus melewati « rw » ke konstruktor, bukan hanya « r »."

"Kedua, lihat metode pencarian. Anda dapat menggunakan metode ini untuk berpindah-pindah file dan mengubah posisi kursor untuk operasi baca/tulis saat ini. Ketika file pertama kali dibuka, kursor disetel ke byte ke-0. Atau, lebih tepatnya, sebelum byte nol."

"Apakah saya mengerti dengan benar? Kami membuka file, dan kursor berada di awal — di posisi 0. Kemudian kami memanggil seek dan memindahkan kursor ke byte ke-100. Dan ketika kami memanggil readLine , itu mulai membaca dari byte keseratus . Benar?"

"Ya. Tapi saya ingin menarik perhatian Anda pada fakta bahwa metode pencarian memungkinkan Anda melompati file secara sewenang-wenang. Misalnya:"

Membaca 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();

"Dalam contoh ini, pertama-tama kita membaca baris yang dimulai dari byte ke-0. Kemudian kita melompat ke byte keseratus dan membaca baris di sana. Lalu kita melompat ke byte ke-0 lagi dan membaca satu baris. Artinya, teks1 dan teks3 identik string."

"Ah. Itu membuat semuanya menjadi lebih jelas."

"Bagus. Lalu ini contoh lainnya:"

Membaca 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();

"Di sini kita membuka file untuk membaca dan menulis dengan mengirimkan « rw » ( read/write ) ke konstruktor."

"Lalu kami menulis « Ini adalah string » ke file.

"Kemudian kita pindahkan kursor ke byte ke-8 (yang kebetulan merupakan awal dari kata 'string')"

"Kemudian kita menulis « kejutan !»"

"Akibatnya, file tersebut berisi « Ini kejutan !»"

"Jadi, byte tidak dimasukkan ke tengah file, melainkan menggantikan yang ada di sana?"

"Ya."

"Bagaimana jika kita memindahkan kursor ke akhir file?"

"Kemudian byte akan ditulis sampai akhir, dan file akan menjadi lebih besar. Jadi hampir seperti menulis teks ke editor teks."

"Hmm. Saya pikir saya mengerti semuanya. Bisakah Anda memberikan daftar lengkap metode kelas RandomAccessFile ?"

"Tentu, ini dia:"

metode Keterangan
int read() Membaca satu byte dan mengembalikannya
int read(byte b[], int off, int len) Membaca array byte
int read(byte b[]) Membaca array byte
void readFully(byte b[]) Membaca larik byte, dan menunggu byte baru ditambahkan jika jumlahnya tidak cukup untuk mengisi larik
int skipBytes(int n) Lewati n byte. Dengan kata lain, ini menggerakkan kursor ke depan n byte.
void write(int b) Menulis satu byte ke lokasi kursor
void write(byte b[]) Menulis array byte ke lokasi kursor
void write(byte b[], int off, int len) Menulis array byte ke lokasi kursor
long getFilePointer() Mengembalikan jumlah byte yang ditunjuk kursor. Ini dapat berkisar dari 0 hingga panjang file
void seek(long pos) Memindahkan «kursor» yang digunakan untuk membaca/menulis ke lokasi yang ditentukan
long length() Mengembalikan panjang file
void setLength(long newLength) Menetapkan panjang file baru. Jika file lebih besar, itu akan terpotong; jika lebih kecil, itu memperluas file dan mengisi ruang baru dengan nol
void close() Menutup file
boolean readBoolean() Membaca boolean dari posisi kursor saat ini di file
byte readByte() Membaca satu byte dari posisi kursor saat ini dalam file
char readChar() Membaca karakter dari posisi kursor saat ini di file
int readInt() Membaca int dari posisi kursor saat ini di file
long readLong() Membaca panjang dari posisi kursor saat ini dalam file
float readFloat() Membaca pelampung dari posisi kursor saat ini di file
double readDouble() Membaca ganda dari posisi kursor saat ini dalam file
String readLine() Membaca baris dari file dan mengembalikannya
void writeBoolean(boolean v) Menulis boolean ke file (mulai dari posisi kursor)
void writeByte(int v) t Menulis byte ke file (mulai dari posisi kursor)
void writeChar(int v) Menulis karakter ke file (mulai dari posisi kursor)
void writeInt(int v) Menulis int ke file (mulai dari posisi kursor)
void writeLong(long v) Menulis panjang ke file (mulai dari posisi kursor)
void writeFloat(float v) Menulis pelampung ke file (mulai dari posisi kursor)
void writeDouble(double v) Menulis ganda ke file (mulai dari posisi kursor)
void writeBytes(String s) Menulis String ke file (mulai dari posisi kursor)
void writeChars(String s) Menulis String ke file (mulai dari posisi kursor)

"Hmm. Jadi, tidak ada yang baru di sini. Kecuali mungkin pasangan metode seek()/getFilePointer() dan length()/setLength()."

"Ya, Amigo. Semuanya hampir sama. Tapi bukankah itu nyaman?"

"Itu nyaman. Terima kasih, Bilaabo, untuk pelajaran yang menarik dan contoh yang Anda berikan kepada saya."

"Senang bisa membantu, Amigo, temanku!"