"Hai, Amigo!"

"Hai, Bilaabo! Bagaimana kehidupan?"

"Hebat. Semalam, saya cuba menyingkirkan beberapa parasit, tetapi setakat ini saya tidak mendapat banyak kejayaan. Dan kemudian saya terpaksa bermalam di dalam tong sampah lagi."

"Jadi... adakah semuanya masih hebat?"

"Anda boleh berkata begitu."

"Bagus. Jadi apa yang awak ada untuk saya hari ini?"

"Hari ini saya akan memberitahu anda tentang kelas RandomAccessFile ."

RandomAccessFile, dsb. - 1

"Perkaranya, FileInputStream dan FileOutputStream mewakili fail sebagai strim: anda hanya boleh membaca dan menulis kepadanya secara berurutan."

"Itu tidak selalunya sangat mudah. ​​Kadangkala anda perlu menulis beberapa baris di tengah-tengah fail, atau membaca beberapa halaman teks dari penghujung fail berbilang megabait. Ia tidak akan menjadi sangat cekap untuk membaca keseluruhan fail untuk tugasan ini."

" Kelas RandomAccessFile dicipta untuk menyelesaikan masalah ini. Anda boleh menggunakannya untuk menulis di mana-mana dalam fail, membaca daripadanya, serta membaca dan menulis ke fail pada masa yang sama."

"Sungguh menarik!"

"Ya. Ia sebenarnya agak mudah."

"Tetapi bagaimana anda membaca dari lokasi sewenang-wenangnya?"

"Semuanya agak mudah. ​​Bayangkan anda mempunyai editor teks, seperti Notepad, terbuka. Ia mempunyai kursor. Apabila anda menaip sesuatu, teks itu ditambah ke mana-mana kursor berada. Membaca fail adalah sama. Membaca bermula dari di mana sahaja 'kursor' berada. Apabila membaca/menulis, kursor bergerak secara automatik."

"Di sini, adalah lebih baik untuk menunjukkan kepada anda contoh:"

Membaca fail:
// 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 kepada dua perkara:"

"Pertama, penciptaan objek RandomAccessFile . Hujah kedua ialah huruf r. Ini bermakna fail dibuka untuk membaca ( r - read ). Jika anda ingin membuka fail untuk membaca dan menulis, anda mesti lulus « rw »kepada pembina, bukannya hanya « r »."

"Kedua, lihat kaedah cari. Anda boleh menggunakan kaedah ini untuk melompat ke sekeliling fail dan menukar kedudukan kursor untuk operasi baca/tulis semasa. Apabila fail pertama kali dibuka, kursor ditetapkan kepada bait ke-0. Atau, lebih tepat, sebelum bait sifar."

"Adakah saya faham dengan betul? Kami membuka fail, dan kursor berada pada peringkat awal — pada kedudukan 0. Kemudian kami memanggil cari dan gerakkan kursor ke bait ke-100. Dan apabila kami memanggil readLine , ia mula membaca dari bait keseratus . Betul ke?"

"Ya. Tetapi saya ingin menarik perhatian anda kepada fakta bahawa kaedah cari membolehkan anda melompat sewenang-wenangnya di sekeliling fail. Contohnya:"

Membaca fail:
// 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, kami mula-mula membaca baris bermula pada bait ke-0. Kemudian kami melompat ke bait keseratus dan membaca baris di sana. Kemudian kami melompat ke bait ke-0 sekali lagi dan membaca satu baris. Ini bermakna teks1 dan teks3 adalah sama rentetan."

"Ah. Itu menjadikan keadaan lebih jelas."

"Bagus. Kemudian ini satu lagi contoh:"

Membaca fail:
// 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 kami membuka fail untuk membaca dan menulis dengan menghantar « rw » ( baca/tulis ) kepada pembina."

"Kemudian kami menulis « Ia adalah rentetan » ke fail.

"Kemudian kami memindahkan kursor ke bait ke-8 (yang kebetulan merupakan permulaan perkataan 'rentetan')"

"Kemudian kami menulis « kejutan !»"

"Akibatnya, fail itu mengandungi « Ia adalah satu kejutan !»"

"Jadi, bait tidak dimasukkan ke tengah-tengah fail, sebaliknya ia menggantikan yang ada di sana?"

"Ya."

"Bagaimana jika kita mengalihkan kursor ke hujung fail?"

"Kemudian bait akan ditulis hingga akhir, dan fail akan menjadi lebih besar. Jadi ia akan menjadi hampir seperti menulis teks ke dalam editor teks."

"Hmm. Saya rasa saya faham semuanya. Bolehkah anda memberikan senarai lengkap kaedah kelas RandomAccessFile ?"

"Tentu. Ini dia:"

Kaedah Penerangan
int read() Membaca satu bait dan mengembalikannya
int read(byte b[], int off, int len) Membaca pelbagai bait
int read(byte b[]) Membaca pelbagai bait
void readFully(byte b[]) Membaca tatasusunan bait, dan menunggu bait baharu ditambah jika bait itu tidak mencukupi untuk mengisi tatasusunan
int skipBytes(int n) Langkau n bait. Dalam erti kata lain, ini menggerakkan kursor ke hadapan n bait.
void write(int b) Menulis satu bait ke lokasi kursor
void write(byte b[]) Menulis tatasusunan bait ke lokasi kursor
void write(byte b[], int off, int len) Menulis tatasusunan bait ke lokasi kursor
long getFilePointer() Mengembalikan nombor bait yang ditunjuk oleh kursor. Ia boleh berkisar antara 0 hingga panjang fail
void seek(long pos) Menggerakkan «kursor» yang digunakan untuk membaca/menulis ke lokasi yang ditentukan
long length() Mengembalikan panjang fail
void setLength(long newLength) Menetapkan panjang fail baharu. Jika fail itu lebih besar, ia akan dipotong; jika ia lebih kecil, maka ia mengembangkan fail dan mengisi ruang baharu dengan sifar
void close() Menutup fail
boolean readBoolean() Membaca boolean daripada kedudukan semasa kursor dalam fail
byte readByte() Membaca bait daripada kedudukan semasa kursor dalam fail
char readChar() Membaca aksara daripada kedudukan semasa kursor dalam fail
int readInt() Membaca int daripada kedudukan semasa kursor dalam fail
long readLong() Membaca panjang dari kedudukan semasa kursor dalam fail
float readFloat() Membaca apungan daripada kedudukan semasa kursor dalam fail
double readDouble() Membaca dua kali ganda daripada kedudukan semasa kursor dalam fail
String readLine() Membaca baris daripada fail dan mengembalikannya
void writeBoolean(boolean v) Menulis boolean ke fail (bermula dari kedudukan kursor)
void writeByte(int v) t Menulis bait ke fail (bermula dari kedudukan kursor)
void writeChar(int v) Menulis aksara pada fail (bermula dari kedudukan kursor)
void writeInt(int v) Menulis int ke fail (bermula dari kedudukan kursor)
void writeLong(long v) Menulis panjang ke fail (bermula dari kedudukan kursor)
void writeFloat(float v) Menulis apungan ke fail (bermula dari kedudukan kursor)
void writeDouble(double v) Menulis dua kali ganda pada fail (bermula dari kedudukan kursor)
void writeBytes(String s) Menulis String pada fail (bermula dari kedudukan kursor)
void writeChars(String s) Menulis String pada fail (bermula dari kedudukan kursor)

"Hmm. Jadi, tiada apa-apa yang baharu di sini. Kecuali mungkin pasangan kaedah seek()/getFilePointer() dan length()/setLength()."

"Ya, Amigo. Semuanya hampir sama. Tetapi bukankah itu memudahkan?"

"Ia mudah. ​​Terima kasih, Bilaabo, untuk pengajaran yang menarik dan untuk contoh yang anda berikan kepada saya."

"Senang membantu, Amigo, kawan saya!"