IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Questions sur RandomAccessFile


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Questions sur RandomAccessFile
    Bonsoir tout le monde,

    Je suis occupé à voire l'accès direct aux fichier (RandommAccessFile).

    J'ai quelques questions à propos de cette classe :

    Je crée une nouvelle variable de type RandomAccessFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RandomAccessFile raf = new RandomAccessFile("c:\\raf.txt","rw");
    j'écris dans ce fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    raf.writeInt(34)
    raf.writeInt(534)
    raf.writeInt(99)
    Si je veux remplacer 99 par 199, dans le cours on à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    raf.seek((3-1)*4);
    raf.WriteInt(199);
    raf.seek(0);
    Ne peut-on pas mettre :

    J'ai bien sure testé, ça fonctionne, mais peut être que ce n'est pas conseillé ?

    Je vois que ceci fonctionne aussi

    Une question à propos de la lecture d'un RandomAccessFile :

    on fait une boucle qui va lire dans la console le contenu de la variable raf et le mettre dans une variable de type int nommée nb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i< 5; i++)
    {
       nb = raf.readInt();
       System.out.println(nb);
    }
    Ma question est la suivante :

    Nous utilisions i ici pour un compteur (0,1,2,3,4) mais quand la variable nb prend la valeur de raf, raf passe à la ligne suiivante ?

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par beegees
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i< 5; i++)
    {
       nb = raf.readInt();
       System.out.println(nb);
    }
    Ma question est la suivante :

    Nous utilisions i ici pour un compteur (0,1,2,3,4) mais quand la variable nb prend la valeur de raf, raf passe à la ligne suiivante ?
    Non, raf passe simplement au byte suivant le nombre entier lu.

    Si raf contient 7894abc, raf.readInt lira 7894, et une prochaine lecture démarrera à a.

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par gifffftane
    Non, raf passe simplement au byte suivant le nombre entier lu.

    Si raf contient 7894abc, raf.readInt lira 7894, et une prochaine lecture démarrera à a.
    Non ! si raf contient sous forme de texte ce que tu marques, raf.readInt lira les quatres premiers octets de la chaine ( 78 dans notre cas, vu qu'en java, un char est codé sur deux octets ) et les convertira en entier. '7' suivi de '8' en char ne donnera certainement pas un entier valant 78.

    Pour répondre à la question de beegees :
    La méthode seek prend en paramètre un long ( y mettre un entier ne pose pas de problème ).
    La valeur de ce long correspond au ième octet sur lequel le randomaccessfile doit se placer.
    Dans ton cas, en dur, un simple raf.seek(8) aurait suffit. Un int valant quatre octets on a donc :
    raf.seek(0) qui place le raf sur le tout premier octet du fichier, soit la première série de 4 octets correspondant à ton premier entier.
    raf.seek(4) te place sur la deuxième série de quatre octets -> deuxième entier stocké dans le fichier
    raf.seek(8) te place sur la troisième série de quatre octets --> le troisième entier qui vaut 99 dans ton cas et que tu veux écraser.


    Pour conclure la notation raf.seek((3-1)*4) a été faite pour un soucis de lisibilité :
    (3-1) signifie le troisième entier stocké, on retire 1 car l'indexation commence à 0 ( le début du fichier ).
    le *4 c'est parque comme je le disais plus haut un entier est codé sur 4 octets.
    Le résultat de (3-1)*4 ainsi que (2*4) ( et aussi (1+1+1+1+1+1+1+1) mais ce serait stupide... ) nous donne bien 8 à chaque fois.

    EDIT : je recentre sur la question, je m'étais un peu éloigné :
    la méthode raf.readInt() fait ceci ( pour simplifier ) :
    - elle lit les 4 octets à partir de l'adresse courante
    - elle converti les 4 octets en un entier qu'elle va retourner
    - elle incrémente son adresse courante de 4 octets pour passer à la suite.

    pour info readLong fait la mème chose mais avec des séries de 8 octets, readChar avec 2 octets, readLine est un peu différent, ça lit tous les octets jusqu'à tomber sur un caractère désignant le saut de ligne, etc.

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Heu... oui je m'ai paumé dans mes petites théories pardon jété aux fraises j'est tout fo je recommenceré pu.

  5. #5
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Bonjour iohack & gifffftane,

    Merci pour vos réponses.

    J'ai lu attentivement vos messages, c'est un peu plus claire maintenant.

    Je reviendrai encore sans doute pour des questions sur ce sujet.

    Merci encore.

    beegees

Discussions similaires

  1. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo