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 :

[Fichier] Lire un fichier texte long


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut [Fichier] Lire un fichier texte long
    Bonjour,

    je besoin de lire un fichier et de découper son contenu à partir de séparateurs.
    Or la méthode que j'utilise prend environ 5mn pour lire une fichier texte de 600 ko

    j'ai cherché un peu mais je n'ai rien trouvé de mieux que ça :

    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
     
    	public static String Flux1(String PathAndFile) {
     
    		String text = "";
    		try
    		{
    			FileInputStream fluxEntrant = new FileInputStream(PathAndFile);
    			BufferedReader lecture = new BufferedReader(new InputStreamReader(fluxEntrant));
     
    			boolean eof = false;
    			while (!eof)
    			{
    				String line = lecture.readLine();
    				if (line == null)
    					eof = true;
    				else
    					text += "\n" + line;
    				}
    			fluxEntrant.close();
    		}
    		catch (IOException e)
    		{
    			System.out.println("IO erreur sur le fichier " + PathAndFile);
    		}	
    		return text;
    	}
    Quelqu'un connait un moyen de gagner du temps ? D'ailleur je ne comprend pas que ce soit aussi long !



    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Je vois deux niveaux où tu peux optimiser ce code :

    utilise directement un FileReader, au lieu du couple FileInputStream / InputStreamReader.

    Au lieu de stocker dans un String, utilises un StringBuffer (monbuffer.append(laligne)), et une fois que le fichier sera lu, tu renverras simplement monbuffer.toString().

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Va voir la classe StringTokenizer, pour découper un texte c'est pas mal du tout !

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2002
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 29
    Points : 21
    Points
    21
    Par défaut
    Slt, pour lire le fichier tu peux le faire comme ca :

    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
     
    File fichierALire = new File ("toto.txt") ;
    String ligne ;
     
    try
    {
        BufferedReader br = new BufferedReader (new FileReader (fichierALire)) ;
     
        while ((ligne = br.readLine()) != null)
        {
            // ton traitement
        }
     
    }
    catch (Exception e)
    {
        e.printStackTrace () ;
    }

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut à tous, merci pour vos réponses
    J'ai suivi les conseils de Tileffeleauzed et j'ai gagné quelques secondes mais ça reste particulièrement lent !

    Je ne comprend pourquoi c'est aussi long, lorsqu'on ouvre un fichier dans Notepad par exemple c'est instantané, quel principe est utilisé ?

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 68
    Points : 72
    Points
    72
    Par défaut
    Tonnerre de Brest, il faut suivre le même principe partout !

    En terme de performances, les fabrications de chaines de caractères à la mode chaine = "toto" + "titi" sont extrêmement couteuses. Extrêmement pratiques, mais extrêmement couteuses. Donc, le text += "\n" + line; qui doit rester, je pense, est à remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    buffer.append('\n');
    buffer.append(line);
    A la suite de quoi, la lecture de ton fichier de 700Ko sera quasi instantanée.

  7. #7
    Membre confirmé Avatar de Scorpyosis
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2004
    Messages : 365
    Points : 570
    Points
    570
    Par défaut
    Moi aussi je te conseille le StringBuffer plutot que le string parce que des lors que tu fais :
    String s = "coucou" ;
    s += "ca va ?";
    Il y a deux instance de la classe String qui sont crées, la première qui est "coucou" puis la seconde qui est "coucou ca va?". Donc utilise StringBuffer c'est dejà mieux .
    Et pis une ptite question pourquoi le test if( line == null) à l'interieur de ta boucle ? fais directement un :
    while( lecture.readLine() != null)
    ca divise par deux le nombres des instructions que tu fais dans ta boucle.
    Et sinon, le Stringtokenizer c'est la classe approprié pour recherche des bouts de chaines quand on connait les délimiteurs.
    En espérant que ca puisse t'aider...

  8. #8
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    oui en effet ça va beaucoup mieux avec un "buffer.append()", je suis passé de 5 mn à quelques secondes de traitement !!!



    merci à tous

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 39
    Points : 30
    Points
    30
    Par défaut
    salut!!

    petite question sur stringtokenizer
    Est t'il possible d'utiliser une chaîne de caractère comme séparateur et non un caractère?

    Dans mon appli dés qu'il voit un caractère appartenant à mon séparateur il s'arrête...vous auriez pas une solution?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 85
    Points : 102
    Points
    102
    Par défaut
    Salut,

    Quand tu crées ton StringTokenizer, tu lui passes en second argument la chaîne de charactère qui correspond à ton délimiteur.

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

Discussions similaires

  1. Lire un fichier (local) depuis fichier HTML externe (internet)
    Par diva_69 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 16/12/2008, 22h44
  2. Réponses: 15
    Dernier message: 28/11/2008, 18h57
  3. Lire des fichiers BTRIEVE sans fichiers DDF
    Par Zep37 dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 27/02/2008, 13h10
  4. Lire un fichier : Lire les caractères entre [ et ]
    Par yetimothee dans le forum C++
    Réponses: 5
    Dernier message: 22/08/2007, 23h40
  5. [Sécurité][fichiers] Lire un fichier crypté
    Par fadeninev dans le forum Langage
    Réponses: 2
    Dernier message: 21/11/2006, 08h48

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