RandomAccessfile
RandomAccessFile wird verwendet, um auf Dateien zuzugreifen, die Datensätze speichern. Sie können die Seek () -Methode verwenden, um auf Datensätze zuzugreifen und zu lesen und zu schreiben. Die Größe dieser Aufzeichnungen muss nicht gleich sein; Ihre Größe und Position müssen jedoch bekannt sein. Diese Klasse ist jedoch auf Betriebsdateien beschränkt.
RandomAccessFile gehört nicht zum InputStream- und OutputStream -Klassen. Tatsächlich hat es neben der Implementierung der DataNput- und DataOutput -Schnittstellen (DataNputStream und DataOutputStream diese beiden Schnittstellen) auch mit diesen beiden Klassen nichts zu tun und verwendet nicht einmal irgendwelche Funktionen, die bereits in den Klassen "InputStream" und "OutputStream" vorhanden sind. Es ist eine völlig unabhängige Klasse, und alle Methoden (hauptsächlich nur zu sich selbst gehören) werden von Grund auf neu geschrieben. Dies kann daran liegen, dass sich RandomAccessfile in der Datei hin und her bewegen kann, daher unterscheidet sich sein Verhalten von anderen E/A -Klassen. Kurz gesagt, es ist eine separate Klasse, die das Objekt direkt erbt.
Grundsätzlich besteht die Arbeitsmethode von RandomAccessFile darin, DataNputStream und DataOutputStream zu kombinieren und einige seiner eigenen Methoden hinzuzufügen, z. Darüber hinaus verfügt sein Konstruktor über einen Parameter, der angibt, ob die Datei im schreibgeschützten Modus ("R") oder im Read-Write-Modus ("RW") (genau das gleiche wie der fopen () von C) geöffnet werden soll. Es unterstützt nicht das Schreiben nur Dateien.
Nur RandomAccessfile verfügt über eine Such -Suchmethode, und diese Methode ist nur für Dateien anwendbar. BuferedInputStream verfügt über eine Mark () -Methode, mit der Sie die Marke festlegen können (das Ergebnis in einer internen Variablen speichern) und dann Reset () aufzurufen, um in diese Position zurückzukehren, aber seine Funktion ist zu schwach und nicht sehr praktisch.
Die meisten Funktionen von RandomAccessFile, aber nicht allen, wurden durch die "Speicher-Made-Dateien" von JDK 1.4 ersetzt. Sie sollten überlegen, ob "Speicher-Made-Dateien" anstelle von RandomAccessfile verwendet werden sollen.
importieren java.io.ioException; import Java.io.randomaccessfile; public class testrandomaccessfile {public static void main (String [] args) löst ioException {randomAccessfile rf = new randomAccessfile ("rTest.dat", "rw") aus; für (int i = 0; i <10; i ++) {// Schreiben Sie den grundlegenden Typ Double Data rf.writedouble (i * 1.414); } rf.close (); rf = new randomAccessfile ("rTest.dat", "rw"); // Verschieben Sie den Dateizeiger direkt auf den 5. Doppeldaten RF.SEEK (5 * 8); // Überschreiben Sie die 6. Doppeldaten RF.WritedoUlble (47.0001); rf.close (); rf = new randomAccessfile ("rTest.dat", "r"); für (int i = 0; i <10; i ++) {System.out.println ("value" + i + ":" + rf.readDouble ()); } rf.close (); }}Speicher zugeordnete Datei
Mit Speicher zugeordneten Dateien können Sie Dateien erstellen und ändern, die zu groß sind, um in den Speicher zu bringen. Mit der Speicher -kartierenden Datei können Sie denken, dass die Datei in den Speicher gelesen wurde und als sehr großes Array darauf zugreift. Diese Lösung kann den Code des Änderns von Dateien erheblich vereinfachen.
filechannel.map (filechannel.mapMode -Modus, lange Position, lange Größe) ordnet den Dateibereich dieses Kanals direkt in den Speicher. Beachten Sie, dass Sie angeben müssen, woher es kartiert und wie groß der Reichweite der Karte ist. Das heißt, es kann auch ein kleines Fragment einer großen Datei abbilden.
MappedByTebuffer ist eine Unterklasse von ByteBuffer, sodass alle Methoden von ByteBuffer, aber eine neue Kraft () wird hinzugefügt, um den Inhalt des Puffers an das Speichergerät zu aktualisieren, lädt die Daten im Speichergerät in den Speichergerät und isLode () im Speicherort, ob die Daten im Speicher mit den Speichereinstellungen synchronisiert sind. Hier demonstrieren wir nur kurz die Methoden Put () und Get (). Darüber hinaus können Sie auch Methoden wie asCharBuffer () verwenden, um die gepufferte Ansicht der entsprechenden Grundtypdaten zu erhalten, mit denen Grundtypdaten einfach lesen und schreiben können.
import Java.io.randomaccessfile; Import Java.nio.MappedBytebuffer; Import Java.nio.Channels.filechannel; Public Class VargeldFiles {statische int länge = 0x8000000; // 128 MB Public static void main (String [] args) löst eine Ausnahme aus {// Um die Datei auf lesbare und beschreibbare Weise zu öffnen, wird hier RandomAccessfile verwendet, um die Datei zu erstellen. Filechannel fc = new randomAccessFile ("test.dat", "rw"). GetChannel (); // Beachten Sie, dass der lesbare und beschreibbare Dateikanal auf dem lesbaren und beschreibbaren Dateistrom selbst basieren muss. MapedBytebuffer out = fc.map (filechannel.mapMode.read_write, 0, Länge); // 128M Inhalt schreiben für (int i = 0; i <länge; i ++) {out.put ((byte) 'x'); } System.out.println ("Fertig schreiben"); // 6 Bytes der Mitte der Datei für (int i = Länge / 2; i <Länge / 2+6; i ++) {System.out.print ((char) out.get (i)); } fc.close (); }}Obwohl anscheinend FileOutputStream zum Schreiben von Zuordnungen verwendet wird, müssen alle Ausgänge in der Zuordnungsdatei RandomAccessFile verwenden. Wenn Sie jedoch nur DateiInputStream lesen müssen, müssen Sie beim Schreiben von Zuordnungsdateien eine Zufallszugriffsdatei verwenden. Vielleicht der Grund zum Lesen beim Schreiben.
Das Programm erstellt eine 128MB -Datei. Wenn Sie den Speicher gleichzeitig lesen, kann er Speicherüberlauf verursachen, aber der Zugriff hier scheint nur ein Moment zu sein, da nur ein kleiner Teil davon tatsächlich in den Speicher übertragen wird und der Rest in der Swap -Datei platziert ist. Auf diese Weise können Sie Super-Large-Dateien (bis zu 2 GB) problemlos ändern. Beachten Sie, dass Java den "Dateizuordnungsmechanismus" des Betriebssystems aufruft, um die Leistung zu verbessern.
Anwendung der RandomAccessfile -Klasse:
/ * * Programmfunktion: Demonstrieren Sie die Operationen der RandomAccessfile -Klasse und implementieren Sie eine Dateikopieroperation. */ package com.lwj.demo; import Java.io.*; öffentliche Klasse RandomAccessFiledemo {public static void main (String [] args) löst Ausnahme aus {randomAccessfile -Datei = new randomAccessfile ("Datei", "rw"); // Die folgenden schreiben Daten in die Dateidatei.WriteInt (20); // Es wird 4 Bytes -Datei einnimmt. Datei.WriteBoolean (true); // besetzt 1 byte file.writeshort (395); // besetzt 2 Bytes -Datei.WriteLong (2325451L); // nimmt 8 Bytes File.WriteUtf ("eine andere UTF -String"); Datei.WriteFloat (35.5f); // besetzt 4 Bytes -Datei.Writechar ('a'); // besetzt 2 Bytes -Datei.SEEK (0); // Setzen Sie die Position der Dateizeiger auf den Start der Datei // Folgendes müssen Daten aus der Datei lesen. Achten Sie auf den Ort des Dateizeigersystems Mit 3 Bytes und in diesem Fall werden ein Boolescher Wert und kurzer Wert übersprungen. System.out.println (Datei.Readfloat ()); Byte [] B = neuer Byte [Len]; RandomAccessFile Insertion -Beispiel:
/ **** @param überspringen, wie viele Bytes zum Einfügen von Daten* @param str -Zeichenfolge zum Einfügen* @param Datei -Dateipfad einfügen*/ public static void beiju (Long Skip, String Str, String Dateiname) {try {randomAccessfile raf = new randomAccessfile (fileName, "rw"); if (überspringen <0 || überspringen> raf.length ()) {System.out.println ("Anzahl übersprungener Bytes übersprungen ist ungültig"); zurückkehren; } byte [] b = str.getBytes (); raf.setLength (raf.length () + B.Length); für (long i = raf.Length () - 1; i> B.Length + überspringen - 1; i -) {raf.seek (i - B.Length); byte temp = raf.readbyte (); Raf.seek (i); raf.writebyte (temp); } raf.seek (überspringen); raf.write (b); raf.close (); } catch (Ausnahme e) {e.printstacktrace (); }}Verwenden Sie RandomAccessFile, um den Multi-Thread-Download von Dateien zu realisieren. Wenn mehrere Threads eine Datei herunterladen, wird die Datei in mehrere Teile unterteilt und jedes Stück wird mit einem anderen Thread heruntergeladen. Hier ist ein Beispiel für die Verwendung von Multithreading beim Schreiben von Dateien, in denen der für die Datei benötigte Speicherplatz vorgewiesen, dann in den zugewiesenen Raum geschnappt und dann geschrieben wurde:
importieren java.io.filenotfoundException; importieren java.io.ioException; import Java.io.randomaccessfile; /*** Test unter Verwendung von Multithreading für Dateischreibvorgänge*/public class Test {public static void main (String [] args) löst eine Ausnahme aus {// Vorab-Speicherplatz vorab, eine Datei mit einer angegebenen Größe wird auf der Festplatte RandomAccessfile RAF = New AccessFile erstellt ("d: //abc.txt.", "rw"); raf.setLength (1024*1024); // vorab esserde 1m Dateiraum RAF.CLOSE (); // Dateiinhalte zu schriftlich Zeichenfolge s1 = "Erster Zeichenfolge"; String S2 = "Zweite Zeichenfolge"; String s3 = "dritte String"; String S4 = "Vierter String"; String S5 = "Fünfter String"; // Schreiben Sie gleichzeitig eine Datei mit mehreren Threads. Neue FileWritetHhread (1024*1, s1.getBytes ()). Start (); // Daten aus 1024 Bytes der Datei neue FileWritetHhread (1024*2, S2.getBytes ()). Start (); // Daten aus 2048 Bytes der Datei neue FileWritetHhread (1024*3, S3.getBytes ()). Start (); // Daten aus 3072 Bytes der Datei neue FileWritetHhread (1024*4, S4.getBytes ()). Start (); // Daten aus 4096 Bytes der Datei neue FileWritetHhread (1024*5, S5.getBytes ()). Start (); // Daten aus 5120 Bytes der Datei schreiben} // Verwenden Sie einen Thread, um angegebene Daten am angegebenen Speicherort der Datei statische Klassen -DateiwritThead -Erweiterung von Thread {private int überaus; privates Byte [] Inhalt; public FileWritThead (int überspringen, byte [] Inhalt) {this.skip = überspringen; this.content = content; } public void run () {randomAccessfile raf = null; try {raf = new randomAccessfile ("d: //abc.txt", "rw"); raf.seek (überspringen); Raf.Write (Inhalt); } catch (FilenotFoundException e) {e.printstacktrace (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } endlich {try {raf.close (); } catch (Ausnahme e) {}}}}}}}Die detaillierte Erklärung der oben genannten Verwendung von Java RandomAccessfile ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.