„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Dateien mit wahlfreiem Zugriff

Dateien mit wahlfreiem Zugriff

Veröffentlicht am 01.08.2024
Durchsuche:843

Java stellt die RandomAccessFile-Klasse bereit, um das Lesen und Schreiben von Daten an beliebigen Stellen in der Datei zu ermöglichen. Alle Streams, die Sie bisher verwendet haben, werden als schreibgeschützte- oder schreibgeschützte-Streams bezeichnet. Diese Streams werden sequentielle Streams genannt. Eine Datei, die mit einem sequentiellen Stream geöffnet wird, wird als Datei mit sequenziellem Zugriff bezeichnet. Der Inhalt einer Datei mit sequenziellem Zugriff kann nicht aktualisiert werden. Allerdings ist es oft notwendig, Dateien zu ändern. Java stellt die Klasse RandomAccessFile bereit, um das Lesen und Schreiben von Daten an beliebigen Stellen in einer Datei zu ermöglichen. Eine Datei, die mit der Klasse RandomAccessFile geöffnet wird, wird als Random-Access-Datei bezeichnet.

Die Klasse RandomAccessFile implementiert die Schnittstellen DataInput und DataOutput, wie in der Abbildung unten dargestellt. Die Schnittstelle DataInput definiert die Methoden zum Lesen von Werten und Zeichenfolgen primitiver Art (z. B. readInt, readDouble, readChar, readBoolean, readUTF) und die Schnittstelle DataOutput definieren die Methoden zum Schreiben von Werten und Zeichenfolgen primitiver Art (z. B. writeInt, writeDouble, writeChar, writeBoolean, writeUTF).

Image description

Beim Erstellen einer RandomAccessFile können Sie einen von zwei Modi angeben: r oder rw. Modus r bedeutet, dass der Stream schreibgeschützt ist, und Modus rw gibt an, dass der Stream sowohl Lesen als auch Schreiben zulässt. Die folgende Anweisung erstellt beispielsweise einen neuen Stream, raf, der es dem Programm ermöglicht, aus der Datei test.dat zu lesen und in diese zu schreiben:

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

Wenn test.dat bereits existiert, wird raf erstellt, um darauf zuzugreifen; Wenn test.dat nicht existiert, wird eine neue Datei mit dem Namen test.dat erstellt und raf wird erstellt, um auf die neue Datei zuzugreifen. Die Methode raf.length() gibt die Anzahl der Bytes in test.dat zu einem bestimmten Zeitpunkt zurück. Wenn Sie neue Daten in die Datei einfügen, erhöht sich raf.length().

Wenn die Datei nicht geändert werden soll, öffnen Sie sie im r-Modus. Dies verhindert eine unbeabsichtigte Änderung der Datei.

Eine Direktzugriffsdatei besteht aus einer Folge von Bytes. Eine spezielle Markierung namens Dateizeiger wird an einem dieser Bytes positioniert. An der Stelle des Dateizeigers findet ein Lese- oder Schreibvorgang statt. Beim Öffnen einer Datei wird der Dateizeiger auf den Anfang der Datei gesetzt. Wenn Sie Daten in die Datei lesen oder schreiben, bewegt sich der Dateizeiger vorwärts zum nächsten Datenelement. Wenn Sie beispielsweise einen int-Wert mit readInt() lesen, liest die JVM 4 Bytes aus dem Dateizeiger, und jetzt ist der Dateizeiger 4 Bytes vor der vorherigen Position, wie in der Abbildung unten dargestellt.

Image description

Für ein RandomAccessFile raf können Sie die Methode raf.seek(position) verwenden, um den Dateizeiger an eine angegebene Position zu verschieben. raf.seek(0) verschiebt es an den Anfang der Datei und raf.seek(raf.length()) verschiebt es an das Ende der Datei. Der folgende Code demonstriert RandomAccessFile.

package demo;
import java.io.*;

public class TestRandomAccessFile {

    public static void main(String[] args) throws IOException {
        try( // Create a random access file
            RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");
        ) {
            // Clear the file to destroy the old contents if exists
            inout.setLength(0);

            // Write new integers to the file
            for(int i = 0; i 



Aktuelle Dateilänge beträgt 800
Die erste Zahl ist 0
Die zweite Zahl ist 1
Die zehnte Zahl ist 9
Die neue Länge ist 804
Die elfte Zahl ist 555

Eine RandomAccessFile wird für die Datei mit dem Namen inout.dat mit dem Modus rw erstellt, um sowohl Lese- als auch Schreibvorgänge in Zeile 8 zu ermöglichen.

inout.setLength(0) setzt die Länge in Zeile 11 auf 0. Dadurch wird der alte Inhalt der Datei zerstört.

Die for-Schleife schreibt 200 int-Werte von 0 bis 199 in die Datei in den Zeilen 14 und 15. Da jedes int-Wert benötigt 4 Bytes, die Gesamtlänge der von inout.length() zurückgegebenen Datei beträgt jetzt 800 (Zeile 18), wie in der Beispielausgabe gezeigt.

Der Aufruf von inout.seek(0) in Zeile 21 setzt den Dateizeiger auf den Anfang der Datei. inout.readInt() liest den ersten Wert in Zeile 22 und bewegt den Dateizeiger auf die nächste Zahl. Die zweite Zahl wird in Zeile 26 gelesen.

inout.seek(9 * 4) (Zeile 29) verschiebt den Dateizeiger auf die zehnte Zahl. inout.readInt() liest die zehnte Zahl und verschiebt den Dateizeiger auf die elfte Zahl in Zeile 30. inout.write(555) schreibt eine neue elfte Zahl an der aktuellen Position ( Zeile 33). Die vorherige elfte Zahl wird zerstört.

inout.seek(inout.length()) verschiebt den Dateizeiger an das Ende der Datei (Zeile 36). inout.writeInt(999) schreibt ein 999 in die Datei (Zeile 37). Jetzt wird die Länge der Datei um 4 erhöht, sodass inout.length() 804 zurückgibt (Zeile 40).

inout.seek(10 * 4) verschiebt den Dateizeiger auf die elfte Zahl in Zeile 43. Die neue elfte Zahl, 555, wird in Zeile 44 angezeigt.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/paulike/random-access-files-1464?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3