Heim  >  Artikel  >  Java  >  Dateien mit wahlfreiem Zugriff

Dateien mit wahlfreiem Zugriff

王林
王林Original
2024-07-18 19:08:51951Durchsuche

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 mithilfe eines sequentiellen Streams 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 primitiven Typs (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 vom Dateizeiger, und jetzt ist der Dateizeiger 4 Bytes vor dem vorherigen Speicherort, 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 bewegen. 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 < 200; i++)
                inout.writeInt(i);

            // Display the current length of the file
            System.out.println("Current file length is " + inout.length());

            // Retrieve the first number
            inout.seek(0); // Move the file pointer to the beginning
            System.out.println("The first number is " + inout.readInt());

            // Retrieve the second number
            inout.seek(1 * 4); // Move the file pointer to the second number
            System.out.println("The second number is " + inout.readInt());

            // Retrieve the tenth number
            inout.seek(9 * 4); // Move the file pointer to the tenth number
            System.out.println("The tenth number is " + inout.readInt());

            // Modify the eleventh number
            inout.writeInt(555);

            // Append a new number
            inout.seek(inout.length()); // Move the file pointer to the end
            inout.writeInt(999);

            // Display the new length
            System.out.println("The new length is " + inout.length());

            // Retrieve the new eleventh number
            inout.seek(10 * 4); // Move the file pointer to the eleventh number
            System.out.println("The eleventh number is " + inout.readInt());
        }
    }

}

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 beträgt 804
Die elfte Zahl ist 555

Eine

RandomAccessFile wird für die Datei namens 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 praktisch der alte Inhalt der Datei zerstört.

Die

for-Schleife schreibt in den Zeilen 14 und 15 200 int-Werte von 0 bis 199 in die Datei. Da jedes int value 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 Nummer wird zerstört.

inout.seek(inout.length()) verschiebt den Dateizeiger an das Ende der Datei (Zeile 36). inout.writeInt(999) schreibt einen 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.

Das obige ist der detaillierte Inhalt vonDateien mit wahlfreiem Zugriff. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn