-- Java SE

RandomAccessFile

  • Şimdiye kadar ki kullandığımız streamlar read-only veya write-only streamlardı.Bunlar sequential(ardışık) stream olarak bilinir,ve bu streamleri kullanarak açtığımız dosyalara ise sequential-access file denir.
  • RandomAccessFile sınıfı DataInput ve DataOutput arayüzlerini uygular.Bu sayede read ve write işlemlerini tek bir nesne ile yapabiliriz,ayrıca dosyadaki verilere istediğimiz kısımdan erişebiliriz.
  • Bir RandomAcessFile nesnesi oluştururken seçebileceğimiz iki mod var.Bunlar “r” veya “rw”.”r” kullanarak oluşturduğumuz nesneler sadece okumaya(read) yönelik olacaktır,”rw” ile oluşturulan nesnelerle hem okuma(read) hem yazma(write) işlemleri yapılabilir.Kodu görmek daha açıklayıcı olur.
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");

Satırındaki kod eğer:

  • test.dat varsa,raf nesnesi ona erişmek için oluşturur.
  • test.dat yoksa,bu isimle bir dosya ve raf nesnesini oluşturur.

 

  • Bir Random-Access file ardışık bytelardan oluşur.İşaretleyici(file pointer) bu bytelardan birinde pozisyonlanır.Read ve write işlemleri bu pointerin olduğu yerden başlar.Dosya ilk açıldığında,pointer dosyanın başında yer alır.Read veya write işlemlerinden sonra yeri değişir.Örnek olarak bir int değerini readInt() metodunu kullanarak okumak istediğimizde JVM pointerin olduğu yerden başlayarak 4 byte okur ve pointer 4 byte ilerler.Aşağıdaki resimde daha açıklayıcı olacaktır.

Pointeri şu metodlarla da hareket ettirebiliriz:

  1. raf.seek(position) = pointeri belirtilen pozisyona götürür.
  2. raf.seek(0) = poniteri dosyanın başına götürür.
  3. raf.seek(raf.length()) = pointeri dosyanın sonuna götürür. raf.length() metodu dosyada kaç byte olduğunu dönderir.

Ufak bir program yazıp,nasıl işlediğini görelim.Yorum satırlarında açıklamalar var.

import java.io.IOException;
import java.io.RandomAccessFile;


public class RandomTest {

    public static void main(String args[]) throws IOException{

        RandomAccessFile raf = new RandomAccessFile("test.bat","rw");

        raf.setLength(0); // Önceden test.bat dosyası varsa içeriğini silmeye yarar.

        for(int i=0; i<200; i++) raf.writeInt(i);

        System.out.println("Yazma işleminden sonra dosya uzunluğu = " + raf.length());

        raf.seek(0); // pointer dosyanın başına geldi.
        System.out.println("1. sayı = " + raf.readInt());

        raf.seek(1*4); // pointer ikinci sayının başında // bir int = 4 byte
        System.out.println("2. sayı = " +raf.readInt());

        raf.seek(9*4); // pointer 10. sayının başında
        System.out.println("Onuncu sayı = " +raf.readInt());

        System.out.println("11. sayı = " +raf.readInt());
        System.out.println("11. sayıyı değiştiriyorum..");
        raf.seek(10*4); // pointer 11. sayının başında
        raf.writeInt(25); // pointer 12. sayının başına gelir.
        raf.seek(10*4); // tekrar 11. sayının başına aldım.
        System.out.println("Değiştikten sonra 11. sayı = " + raf.readInt());

        raf.seek(raf.length()); // pointer dosyanın sonunda
        raf.writeInt(999); // yeni sayı eklendi.
        System.out.println("Yeni sayı eklendikten sonra dosya uzunluğu = " + raf.length());




    }
}
Yazma işleminden sonra dosya uzunluğu = 800
1. sayı = 0
2. sayı = 1
Onuncu sayı = 9
11. sayı = 10
11. sayıyı değiştiriyorum..
Değiştikten sonra 11. sayı = 25
Yeni sayı eklendikten sonra dosya uzunluğu = 804

Sınıfın sahip olduğu metodlar :

Yorum bırak

Yorum