Java fournit la classe RandomAccessFile pour permettre la lecture et l'écriture des données à n'importe quel emplacement du fichier. Tous les flux que vous avez utilisés jusqu'à présent sont appelés flux lecture seule ou écriture seule. Ces flux sont appelés flux séquentiels. Un fichier ouvert à l'aide d'un flux séquentiel est appelé un fichier à accès séquentiel. Le contenu d'un fichier à accès séquentiel ne peut pas être mis à jour. Cependant, il est souvent nécessaire de modifier les fichiers. Java fournit la classe RandomAccessFile pour permettre la lecture et l'écriture de données à n'importe quel emplacement d'un fichier. Un fichier ouvert à l'aide de la classe RandomAccessFile est appelé fichier à accès aléatoire.
La classe RandomAccessFile implémente les interfaces DataInput et DataOutput, comme le montre la figure ci-dessous. L'interface DataInput définit les méthodes de lecture des valeurs et des chaînes de type primitif (par exemple, readInt, readDouble, readChar, readBoolean, readUTF) et l'interface DataOutput définit les méthodes d'écriture de valeurs et de chaînes de type primitif (par exemple, writeInt, writeDouble, writeChar, writeBoolean, writeUTF).
Lors de la création d'un RandomAccessFile, vous pouvez spécifier l'un des deux modes suivants : r ou rw. Le mode r signifie que le flux est en lecture seule, et le mode rw indique que le flux permet à la fois la lecture et l'écriture. Par exemple, l'instruction suivante crée un nouveau flux, raf, qui permet au programme de lire et d'écrire dans le fichier test.dat :
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
Si test.dat existe déjà, raf est créé pour y accéder ; si test.dat n'existe pas, un nouveau fichier nommé test.dat est créé, et raf est créé pour accéder au nouveau fichier. La méthode raf.length() renvoie le nombre d'octets dans test.dat à un moment donné. Si vous ajoutez de nouvelles données dans le fichier, raf.length() augmente.
Si le fichier n'est pas destiné à être modifié, ouvrez-le avec le mode r. Cela évite toute modification involontaire du fichier.
Un fichier à accès aléatoire est constitué d'une séquence d'octets. Un marqueur spécial appelé pointeur de fichier est positionné sur l'un de ces octets. Une opération de lecture ou d'écriture a lieu à l'emplacement du pointeur de fichier. Lorsqu'un fichier est ouvert, le pointeur de fichier est placé au début du fichier. Lorsque vous lisez ou écrivez des données dans le fichier, le pointeur de fichier avance vers l'élément de données suivant. Par exemple, si vous lisez une valeur int en utilisant readInt(), la JVM lit 4 octets à partir du pointeur de fichier, et maintenant le pointeur de fichier est 4 octets avant l'emplacement précédent, comme le montre la figure ci-dessous.
Pour un RandomAccessFile raf, vous pouvez utiliser la méthode raf.seek(position) pour déplacer le pointeur de fichier vers une position spécifiée. raf.seek(0) le déplace au début du fichier, et raf.seek(raf.length()) le déplace à la fin du fichier. Le code ci-dessous illustre 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()); } } }
La longueur actuelle du fichier est de 800
Le premier chiffre est 0
Le deuxième chiffre est 1
Le dixième chiffre est 9
La nouvelle longueur est 804
Le onzième nombre est 555
Un RandomAccessFile est créé pour le fichier nommé inout.dat avec le mode rw pour permettre les opérations de lecture et d'écriture en ligne 8.
inout.setLength(0) définit la longueur sur 0 à la ligne 11. Ceci, en fait, détruit l'ancien contenu du fichier.
La boucle for écrit 200 int valeurs de 0 à 199 dans le fichier aux lignes 14 et 15. Puisque chaque int prend 4 octets, la longueur totale du fichier renvoyé par inout.length() est maintenant 800 (ligne 18), comme indiqué dans l'exemple de sortie.
L'appel de inout.seek(0) à la ligne 21 place le pointeur de fichier au début du fichier. inout.readInt() lit la première valeur de la ligne 22 et déplace le pointeur de fichier vers le numéro suivant. Le deuxième numéro est lu à la ligne 26.
inout.seek(9 * 4) (ligne 29) déplace le pointeur de fichier vers le dixième nombre. inout.readInt() lit le dixième nombre et déplace le pointeur de fichier vers le onzième nombre de la ligne 30. inout.write(555) écrit un nouveau onzième nombre à la position actuelle ( ligne 33). Le onzième numéro précédent est détruit.
inout.seek(inout.length()) déplace le pointeur de fichier vers la fin du fichier (ligne 36). inout.writeInt(999) écrit un 999 dans le fichier (ligne 37). Maintenant, la longueur du fichier est augmentée de 4, donc inout.length() renvoie 804 (ligne 40).
inout.seek(10 * 4) déplace le pointeur de fichier vers le onzième nombre de la ligne 43. Le nouveau onzième nombre, 555, est affiché à la ligne 44.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!