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é 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éfinissent 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 : 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 empêche toute modification involontaire du fichier.
Un fichier à accès aléatoire se compose 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 à l'aide de 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; iLa longueur actuelle du fichier est de 800
Le premier chiffre est 0
Le deuxième chiffre est 1
Le dixième nombre est 9
La nouvelle longueur est 804
Le onzième nombre est 555Un RandomAccessFile est créé pour le fichier nommé inout.dat avec le mode rw pour permettre les opérations de lecture et d'écriture à la ligne 8.
inout.setLength(0) définit la longueur sur 0 à la ligne 11. Cela détruit en fait l'ancien contenu du fichier.
La boucle for écrit 200 valeurs int de 0 à 199 dans le fichier aux lignes 14 et 15. Puisque chaque [ La valeur &&&]int prend 4 octets, la longueur totale du fichier renvoyé par inout.length() est maintenant de 800 (ligne 18), comme indiqué dans l’exemple de sortie.
L'appel deinout.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.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3