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
undDataOutput
, genauso wie dieDataInputStream
undDatatOutputStream
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);
