D'après l'étude précédente, nous savons que si vous souhaitez lire un fichier, vous devez créer un flux d'entrée pointant vers le fichier ; si vous souhaitez écrire un fichier, vous devez créer un flux de sortie pointant vers le fichier. Alors, pouvez-vous créer un flux à travers lequel vous pouvez à la fois lire et écrire des fichiers ? C’est exactement le sujet de cette section sur les flux aléatoires.
Le flux créé par la classe RandomAccessFile est appelé flux aléatoire . Contrairement aux flux d'entrée et de sortie précédents, la classe RandomAccessFile n'est ni une sous-classe de la classe InputStream ni une sous-classe de la classe OutputStream. Cependant, le point du flux créé par la classe RandomAccessFile peut être utilisé comme source du flux, ou comme destination du flux. En d'autres termes, lors de la préparation de la lecture et de l'écriture d'un fichier, créez un flux aléatoire pointant vers le flux. fichier, vous pouvez donc lire les données du fichier à partir de ce flux, et vous pouvez également écrire des données dans le fichier via ce flux.
Voici les deux constructeurs de la classe RandomAccessFile :
Le paramètre name est utilisé pour déterminer un nom de fichier, donnant la source du flux créé, qui est également la destination du flux. Le paramètre mode est r (lecture seule) ou rw (lecture-écriture), qui détermine les droits d'accès du flux créé au fichier.
Le fichier de paramètres est un objet File qui donne la source du flux créé et est également la destination du flux. Le paramètre mode est r (lecture seule) ou rw (lecture-écriture), qui détermine les droits d'accès du flux créé au fichier.
Remarque : Lorsque le flux RandomAccessFile pointe sur un fichier, le fichier n'est pas actualisé.
Il existe une méthode seek(long a) dans la classe RandomAccessFile qui est utilisée pour localiser la position de lecture et d'écriture du flux RandomAccessFile. Le paramètre a détermine le nombre d'octets depuis la position de lecture et d'écriture jusqu'au début du fichier. De plus, le flux peut également appeler la méthode getFilePointer() pour obtenir la position actuelle de lecture et d'écriture du flux. Le flux RandomAccessFile est plus flexible pour la lecture et l’écriture de fichiers que la lecture et l’écriture séquentielles.
Par exemple, écrivez plusieurs entiers int dans un fichier nommé tom.dat, puis lisez les données dans l'ordre inverse :
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.writeInt(data[i]);}for(longi=data.length-1;i>=0;i --){inAndOut.seek(i*4);System.out.printf(t%d,inAndOut.readInt());/*Une donnée de type int occupe 4 octets, inAndOut commence à partir du 36ème du fichier Lire les derniers octets entiers et lire un entier tous les 4 octets en avant*/}inAndOut.close();}catch(IOExceptione){}}}
Les méthodes courantes du flux RandomAccessFile sont les suivantes :
Remarque : Lorsque la méthode readLine() du flux RandomAccessFile lit des fichiers contenant des caractères non-ASCⅡ, tels que des fichiers contenant des caractères chinois, des « caractères tronqués » apparaîtront. Par conséquent, il est nécessaire de ré-encoder la chaîne lue par readLine() en utilisant l'encodage "iso-8859-1" et de la stocker dans un tableau d'octets, puis d'utiliser l'encodage par défaut de la machine actuelle pour convertir le tableau en chaîne. . L'opération est la suivante :
Stringstr=in.readLine();
byteb[]=str.getBytes(iso-8859-1);
Stringcontent=newString(b);
Si le codage par défaut de la machine est "GB2312", alors
Stringcontent=newString(b);
Équivalent à
Stringcontent=newString(b,GB2312);
Par exemple:
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){RandomAccessFilein=null;try{in=newRandomAccessFile(Main.java,rw);longlength=in.length();//Obtenir la longueur du fichier longposition= 0; in.seek(position);//Localisez la position de lecture au début du fichier while(position<length){Stringstr=in.readLine();byteb[]=str.getBytes(iso-8859-1) ;str =newString(b);position=in.getFilePointer();System.out.println(str);}}catch(IOExceptione){}}}