Random Access Files

Der Außenseiter RandomAccessFile

  • Streams bieten eine elegante Abstraktion, reichen manchmal aber nicht aus, um alle denkbaren Probleme zu lösen
  • RandomAccessFile erlaubt den wahlfreien Zugriff auf Dateien, folgt aber nicht den Konventionen der Streams und ist nicht Teil der Klassenhierarchie der Streams
  • Es hat ein anderes API, implementiert aber DataInput und DataOutput, genauso wie die DataInputStream und DatatOutputStream

Methoden von RandomAccessFile

  • int read(), int read(byte b[], int off, int len), int read(byte b[])
  • void readFully(byte b[]), void readFully(byte b[], int off, int len)
  • int skipBytes(int n)
  • void write(int b), void write(byte b[]), void write(byte b[], int off, int len)
  • long getFilePointer()
  • void seek(long pos)
  • long length()
  • void setLength(long newLength)
  • void close()
  • boolean readBoolean(), int readInt(), …
  • String readLine()
  • void writeBoolean(boolean v), void writeInt(int i), …

Die Modi von RandomAccessFile

Beim Öffnen einer Datei mit RandomAccessFile muss man einen Modus mitgeben

  • "r" – Nur lesender Zugriff
  • "rw" – Lesender und schreibender Zugriff
  • "rws" – wie „rw“ ohne Pufferung für den Inhalt und Metadaten
  • "rwd" – wie „rw“ ohne Pufferung für den Inhalt

Beispiel: RandomAccessFile

List<Student> studenten = new ArrayList<Student>();
studenten.add(new Student(100001L, 29));
...
RandomAccessFile db = new RandomAccessFile("/tmp/datenbank", "rw");

// Schreibe alle Matrikelnummern und Noten
for (Student student : studenten) {
    db.writeLong(student.matrikelNr);
    db.writeInt(student.note);
}

long length = db.length();
long datensatz = 0;
int besteNote = Integer.MAX_VALUE;
// Suche die beste Note
while (datensatz + 12 < length) {
    db.seek(datensatz + 8);
    int note = db.readInt();
    besteNote = Math.min(note, besteNote);
    datensatz += 12;
}
db.close();

System.out.println("Beste Note: " + (double) besteNote / 10);

Copyright © 2025 Thomas Smits