Aus der vorherigen Studie wissen wir, dass Sie zum Lesen einer Datei einen Eingabestream erstellen müssen, der auf die Datei verweist. Wenn Sie eine Datei schreiben möchten, müssen Sie einen Ausgabestream erstellen, der auf die Datei verweist. Können Sie also einen Stream erstellen, über den Sie Dateien sowohl lesen als auch schreiben können? Genau darum geht es in diesem Abschnitt um Zufallsströme.
Der von der RandomAccessFile-Klasse erstellte Stream wird als Zufallsstream bezeichnet. Im Gegensatz zu den vorherigen Eingabe- und Ausgabestreams ist die RandomAccessFile-Klasse weder eine Unterklasse der InputStream-Klasse noch eine Unterklasse der OutputStream-Klasse. Der von der RandomAccessFile-Klasse erstellte Punkt des Streams kann jedoch als Quelle des Streams oder als Ziel des Streams verwendet werden. Mit anderen Worten: Wenn Sie das Lesen und Schreiben einer Datei vorbereiten, erstellen Sie einen zufälligen Stream, der auf den zeigt Datei, sodass Sie Daten aus der Datei aus diesem Stream lesen und über diesen Stream auch Daten in die Datei schreiben können.
Im Folgenden sind die beiden Konstruktoren der RandomAccessFile-Klasse aufgeführt:
Der Name-Parameter wird verwendet, um einen Dateinamen zu bestimmen, der die Quelle des erstellten Streams angibt, der auch das Stream-Ziel ist. Der Parametermodus ist r (schreibgeschützt) oder rw (Lesen/Schreiben), was die Zugriffsrechte des erstellten Streams auf die Datei bestimmt.
Die Parameterdatei ist ein File-Objekt, das die Quelle des erstellten Streams angibt und auch das Stream-Ziel ist. Der Parametermodus ist r (schreibgeschützt) oder rw (Lesen/Schreiben), was die Zugriffsrechte des erstellten Streams auf die Datei bestimmt.
Hinweis : Wenn der RandomAccessFile-Stream auf eine Datei verweist, wird die Datei nicht aktualisiert.
In der Klasse „RandomAccessFile“ gibt es eine Methode „seeke(long a)“, mit der die Lese- und Schreibposition des RandomAccessFile-Streams ermittelt werden kann. Der Parameter „a“ bestimmt die Anzahl der Bytes von der Lese- und Schreibposition bis zum Anfang der Datei. Darüber hinaus kann der Stream auch die Methode getFilePointer() aufrufen, um die aktuelle Lese- und Schreibposition des Streams abzurufen. Der RandomAccessFile-Stream ist beim Lesen und Schreiben von Dateien flexibler als das sequentielle Lesen und Schreiben.
Schreiben Sie beispielsweise mehrere int-Ganzzahlen in eine Datei mit dem Namen tom.dat und lesen Sie die Daten dann in umgekehrter Reihenfolge:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFileinAndOut=null;intdata[]={1,2,3,4,5,6,7,8,9,10};try{inAndOut=newRandomAccessFile (tom.dat,rw);for(inti=0;i<data.length;i++){inAndOut.wr iteInt(data[i]);}for(longi=data.length-1;i>=0;i--){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut .readIn t());/*Daten vom Typ int belegen 4 Bytes, inAndOut liest die letzte Ganzzahl aus dem 36. Byte der Datei und liest alle 4 Bytes eine Ganzzahl vorwärts*/}inAndOut .close();}catch(IOExceptione) {}}}
Übliche Methoden des RandomAccessFile-Streams sind wie folgt:
Hinweis : Wenn die readLine()-Methode des RandomAccessFile-Streams Dateien liest, die Nicht-ASCⅡ-Zeichen enthalten, z. B. Dateien mit chinesischen Zeichen, werden „verstümmelte Zeichen“ angezeigt. Daher ist es erforderlich, die von readLine () gelesene Zeichenfolge mit der Kodierung „iso-8859-1“ neu zu kodieren und in einem Byte-Array zu speichern und dann die Standardkodierung des aktuellen Computers zu verwenden, um das Array in eine Zeichenfolge umzuwandeln . Die Operation ist wie folgt:
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=newString(b);
Wenn die Standardkodierung der Maschine „GB2312“ ist, dann
Stringcontent=newString(b);
Äquivalent zu
Stringcontent=newString(b,GB2312);
Zum Beispiel:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//Ermitteln Sie die Länge der Datei longposition= 0; in.seek(positi on);//Suchen Sie die Leseposition am Anfang der Datei while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1);str=newString(b );position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}