Maison > Java > javaDidacticiel > le corps du texte

Fichiers à accès aléatoire

王林
Libérer: 2024-07-18 19:08:51
original
950 Les gens l'ont consulté

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).

Image description

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.

Image description

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());
        }
    }

}

Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!