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).
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 imr-Modus. Dies verhindert eine unbeabsichtigte Änderung der Datei.
Eine Direktzugriffsdatei besteht aus einer Folge von Bytes. Eine spezielle Markierung namensDateizeiger 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.
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()); } } }
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
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.
Diefor-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!