"Merhaba, Amigo!"

"Merhaba Bilaabo! Hayat nasıl?"

"Harika. Dün bazı parazitlerden kurtulmaya çalıştım ama şu ana kadar pek başarılı olamadım. Sonra geceyi yine çöp tenekesinde geçirmek zorunda kaldım."

"Yani... her şey hâlâ harika mı?"

"Öyle diyebilirsin."

"Güzel. Peki bugün benim için ne var?"

"Bugün size RandomAccessFile sınıfından bahsedeceğim ."

Rastgele Erişim Dosyası vb. - 1

"Mesele şu ki, FileInputStream ve FileOutputStream dosyaları akışlar olarak temsil ediyor: bunları yalnızca sırayla okuyabilir ve yazabilirsiniz."

"Bu her zaman çok uygun değil. Bazen bir dosyanın ortasına birkaç satır yazmanız veya çok megabaytlık bir dosyanın sonundan birkaç sayfa metin okumanız gerekir. Okumak çok verimli olmaz. bu görevler için tüm dosya."

" RastgeleAccessFile sınıfı bu sorunu çözmek için oluşturuldu. Onu dosyanın herhangi bir yerine yazmak, dosyadan okumak ve aynı zamanda dosyaya hem okumak hem de yazmak için kullanabilirsiniz."

"Ne kadar ilginç!"

"Evet. Aslında oldukça uygun."

"Ama keyfi bir konumdan nasıl okursun?"

"Hepsi çok basit. Notepad gibi bir metin düzenleyicinizin açık olduğunu hayal edin. Bir imleci var. Bir şey yazdığınızda, metin imlecin olduğu yere eklenir. Bir dosyayı okumak aynıdır. Okumaya başlar. "imleç" nerede olursa olsun. Okurken/yazarken imleç otomatik olarak hareket eder."

"İşte, sana bir örnek göstermek daha iyi olacak:"

Bir dosyayı okumak:
// 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();

"Bu örnekte iki şeye dikkatinizi çekmek istiyorum:"

"İlk olarak, RandomAccessFile nesnesinin oluşturulması . İkinci argüman r harfidir. Bu, dosyanın okumaya açıldığı anlamına gelir ( r - read ). Bir dosyayı okuma ve yazma için açmak istiyorsanız, « rw'yi geçmelisiniz. » sadece « r » yerine yapıcıya ."

"İkinci olarak, arama yöntemine bakın. Bu yöntemi, dosyanın etrafında atlamak ve geçerli okuma/yazma işlemi için imleç konumunu değiştirmek için kullanabilirsiniz. Bir dosya ilk açıldığında, imleç 0. bayta ayarlanır. Veya, daha doğrusu, sıfırıncı bayttan önce."

"Doğru mu anladım? Dosyayı açıyoruz ve imleç en başta - 0 konumunda. Sonra ara diyoruz ve imleci 100. bayta hareket ettiriyoruz. Ve readLine'ı çağırdığımızda yüzüncü bayttan okumaya başlıyor . Sağ?"

"Evet. Ama dikkatinizi, arama yönteminin dosya üzerinde keyfi olarak atlamanıza izin verdiği gerçeğine çekmek istiyorum. Örneğin:"

Bir dosyayı okumak:
// 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();

"Bu örnekte önce 0. bayttan başlayarak bir satır okuyoruz. Sonra yüzüncü bayta atlayıp orada bir satır okuyoruz. Sonra tekrar 0. bayta atlayıp bir satır okuyoruz. Demek ki text1 ve text3 aynı Teller."

"Ah. Bu her şeyi daha açık hale getiriyor."

"Harika. O zaman işte başka bir örnek:"

Bir dosyayı okumak:
// 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();

"Burada, yapıcıya « rw » ( read/write ) ileterek dosyayı okuma ve yazma için açıyoruz ."

"Ardından dosyaya « It is a string » yazıyoruz .

"Ardından imleci 8. bayta götürüyoruz (bu, 'dize' kelimesinin başlangıcı olur)"

"Sonra « sürpriz !» yazıyoruz "

"Sonuç olarak, dosyada « Bu bir sürpriz

"Yani, baytlar dosyanın ortasına yerleştirilmiyor, bunun yerine orada bulunanların yerini alıyorlar, öyle mi?"

"Evet."

"İmleci dosyanın en sonuna götürürsek ne olur?"

"Sonra baytlar sonuna kadar yazılacak ve dosya büyüyecek. Yani neredeyse bir metin düzenleyiciye metin yazmak gibi olacak."

"Hmm. Sanırım her şeyi anladım. RandomAccessFile sınıfının yöntemlerinin tam bir listesini verebilir misiniz?"

"Elbette. Buyrun:"

Yöntem Tanım
int read() Bir baytı okur ve döndürür
int read(byte b[], int off, int len) Bir dizi bayt okur
int read(byte b[]) Bir dizi bayt okur
void readFully(byte b[]) Bir bayt dizisini okur ve diziyi doldurmak için yeterli bayt yoksa, yeni baytların eklenmesini bekler.
int skipBytes(int n) n baytı atla. Başka bir deyişle, bu, imleci n bayt ileri taşır.
void write(int b) İmlecin konumuna bir bayt yazar
void write(byte b[]) İmlecin konumuna bir bayt dizisi yazar
void write(byte b[], int off, int len) İmlecin konumuna bir bayt dizisi yazar
long getFilePointer() İmlecin işaret ettiği baytın numarasını döndürür. 0'dan dosya uzunluğuna kadar değişebilir
void seek(long pos) Okuma/yazma için kullanılan «imleci» belirtilen konuma taşır
long length() Dosya uzunluğunu döndürür
void setLength(long newLength) Yeni bir dosya uzunluğu ayarlar. Dosya daha büyükse kesilir; daha küçükse, dosyayı genişletir ve yeni alanı sıfırlarla doldurur
void close() dosyayı kapatır
boolean readBoolean() İmlecin dosyadaki geçerli konumundan bir boole değeri okur
byte readByte() İmlecin dosyadaki mevcut konumundan bir bayt okur
char readChar() Dosyada imlecin mevcut konumundan bir karakter okur
int readInt() İmlecin dosyadaki mevcut konumundan bir int okur
long readLong() Dosyada imlecin mevcut konumundan uzun bir süre okur
float readFloat() İmlecin dosyadaki mevcut konumundan bir kayan nokta okur
double readDouble() İmlecin dosyadaki geçerli konumundan bir çift okur
String readLine() Dosyadan bir satır okur ve onu döndürür
void writeBoolean(boolean v) Dosyaya bir boole yazar (imlecin konumundan başlayarak)
void writeByte(int v) t Dosyaya bir bayt yazar (imlecin konumundan başlayarak)
void writeChar(int v) Dosyaya bir karakter yazar (imlecin konumundan başlayarak)
void writeInt(int v) Dosyaya bir int yazar (imlecin konumundan başlayarak)
void writeLong(long v) Dosyaya bir uzun yazar (imlecin konumundan başlayarak)
void writeFloat(float v) Dosyaya bir kayan nokta yazar (imlecin konumundan başlayarak)
void writeDouble(double v) Dosyaya bir çift yazar (imlecin konumundan başlayarak)
void writeBytes(String s) Dosyaya bir String yazar (imlecin konumundan başlayarak)
void writeChars(String s) Dosyaya bir String yazar (imlecin konumundan başlayarak)

"Hmm. Yani, burada yeni bir şey yok. Belki search()/getFilePointer() ve length()/setLength() yöntem çiftleri dışında."

"Evet, Amigo. Her şey hemen hemen aynı. Ama bu uygun değil mi?"

"Uygun. İlginç bir ders ve bana verdiğin örnekler için teşekkür ederim Bilaabo."

"Yardım etmekten memnuniyet duyarım, Amigo, dostum!"