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 :

Positionner le curseur dans un fichier


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut Positionner le curseur dans un fichier


    Voilà j'utilise un LineNumberReader pour lire les entrées d'un fichier line par line. Maintenant il peut arriver que j'ai besoin de revenir au début de la line lue (comme si finalement je ne l'avais pas lu). Je suppose qu'il y a un moyen de le faire mais pas moyen de mettre la main dessus .... Une petite aide serait la bienvenue.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Bien que je ne vois pas trop la raison du pourquoi tu as besoin de relire deux fois la même ligne, tu peux utiliser les méthodes mark()/reset() si c'est supporté par ton flux (markSupported()), mais cela peut être couteux car cela peut utilisé des buffers interne.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
            LineNumberReader r = new LineNumberReader(new FileReader("manifest"));
            try {
     
                // on marque la position dans le flux
                if (r.markSupported()) {
                    r.mark(1024);
                }
     
                String line;
                while ( (line=r.readLine()) != null) {
                    System.out.println( line );
     
                    // On se repositionne sur la marque précédente
                    if (r.markSupported()) {
                        r.reset();
                    }    
     
                    // On relit la ligne :
                    System.out.println( r.readLine() );
     
                    // on marque la position dans le flux
                    if (r.markSupported()) {
                        r.mark(1024);
                    }
                }
     
            } finally { r.close(); }
    Par contre si ta source est toujours un fichier, tu peux utiliser RandomAccessFile pour te déplacer à loisir dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
            RandomAccessFile f = new RandomAccessFile("manifest", "r");
            try {
     
                // on récupère la position dans le fichier :
                long offset = f.getFilePointer();
     
                // Lecture ligne par ligne :
                String line;
                while ( (line=f.readLine()) != null) {
                    System.out.println( line );
     
                    // On se remet sur la position de départ
                    f.seek(offset);
     
                    // On relit la ligne :
                    System.out.println( f.readLine() );
     
                    // on récupère la position dans le fichier :
                    offset = f.getFilePointer();
                }
     
            } finally { f.close(); }
    a++

  3. #3
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Merci AdiGuba. Je vais sûrement opter pour la deuxième solution.

    La raison pour laquelle j'ai "besoin" de revenir en arrière est que mon fichier contient des blocs. Chaque bloc étant identifier par un nom dans le style [<name>]. Le moyen pour moi de savoir que j'ai fini de lire un bloc est de vérifier que la line lue commence pas "[". Si oui, je me remet au début de la line et je recommence pour un second bloc ...

  4. #4
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Voilà j'ai enfin eu le temps d'implémenter la solution basée sur RandomAccessFile et ça marche perfect!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Positionnement du curseur dans un fichier texte
    Par smohrt dans le forum Débuter
    Réponses: 2
    Dernier message: 26/02/2013, 17h43
  2. Utilisation de positionnement de curseur dans un fichier
    Par roswellboy dans le forum Windows
    Réponses: 1
    Dernier message: 05/04/2008, 19h02
  3. Réponses: 3
    Dernier message: 27/11/2005, 01h19
  4. Positionner le curseur dans un champ
    Par Smint dans le forum Access
    Réponses: 17
    Dernier message: 23/09/2005, 21h02
  5. Réponses: 6
    Dernier message: 06/05/2004, 09h05

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