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 :

[FileReader] Fin de Stream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut [FileReader] Fin de Stream
    Bonjour,

    J'ai une fonction dans laquelle je lis un fichier caractere par caractere pour ensuite l'afficher dans ma classe qui etend JEditorPane...
    voici mon code :
    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
     
    public void ouvrir(String s)
    {
      try
      {
        FileReader f = new FileReader(new File(s));
        String s1="";
        int n=f.read();
        while(n!=-1) // tant qu'on n'est pas a la fin du stream
        {
            s1+=(char)n;
            n=f.read();
        }
        setText(s1);
       }
       catch(Exception e){}
       {
           System.out.println("erreur");
       }
    }
    Probleme : Le read() ne renvoit jamais -1 mais semble boucler le fichier, ce qui fait que mon programme n'affiche jamais mon ficher dans mon JEditorPane mais gele...
    Bug ?

    merci

    mavina

  2. #2
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Tu as une erreur ou bien la boucle est infinie?

  3. #3
    Membre actif Avatar de scifire
    Inscrit en
    Juillet 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 226
    Points : 245
    Points
    245
    Par défaut
    Je te propose plutot 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
    19
    20
    21
    22
    23
    24
    25
    public void ouvrir(final String fName){
            String line;
            final StringBuffer buffer = new StringBuffer();
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(fName));
                while ((line = reader.readLine()) != null) {
                    buffer.append(line);
                }
     
                // setText(buffer.toString());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (Exception e) {
     
                }
            }
        }
    Surtout il faut eviter
    parce que les chaines de caracteres sont non-mutables et donc chaque fois tu crees une nouvelle String

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ok, Ca marche a une exception pres : il ne prend pas en compte les retours chariot si ?
    Est-il possible de prendre en compte les retours chariot dans ton cas ?

    merci

    mavina

  5. #5
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Au pire tu peux les rajouter mùanuellement vu qu'un readLine correspond à la lecture d'une ligne, donc tu peux toujours ajouter un \n au StringBuffer apres y avoir rentré le contenu de la ligne....

  6. #6
    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,

    Citation Envoyé par mavina
    Ok, Ca marche a une exception pres : il ne prend pas en compte les retours chariot si ?
    En effet la méthode readLine() du BufferedReader supprime les fins de ligne. Au pire tu peux les rajouter toi-même avec le code suivant :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String endl = System.getProperty("line.separator");
     
    // puis dans le while :
    buffer.append(line).append(endl);
    Citation Envoyé par mavina
    Est-il possible de prendre en compte les retours chariot dans ton cas ?
    Tu peux également te passer du BufferedReader et effectuer toi même la lecture bufférisé :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public void ouvrir(final String fName) throws IOException, FileNotFoundException {
            final StringBuffer buffer = new StringBuffer();
            Reader reader = new FileReader(fName);
            char[] cBuf = new char[1024];
            int len;
            try {
                while ((len = reader.read(cBuf)) > 0) {
                    buffer.append(cBuf, 0, len);
                }
            } finally {
                reader.close();
            }
        }
    a++

  7. #7
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    adiGuba mise a part ton stringbuffer a la place de mon string, c'est le meme code que mon premier post
    donc on va avoir le meme probleme, as tu testé ton code ?

    Merci, j'ai ajouté un .append(endl) ca marche sans aucun probleme !

  8. #8
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par mavina
    adiGuba mise a part ton stringbuffer a la place de mon string, c'est le meme code que mon premier post
    donc on va avoir le meme probleme, as tu testé ton code ?

    Merci, j'ai ajouté un .append(endl) ca marche sans aucun probleme !
    AdiGuba utilises un buffer pour lire le fichier au lieu de le lire caractere par caractere comme dans ton code.
    Il sera beaucoup plus rapide que toi pour lire le fichier.

    J'ai teste ton code et il marche donc ce n'est pas le probleme du -1.

    Je vois que tu fais un setText, es-tu sur de le faire depuis l'Event Dispatch Thread ?

    Si ce n'est pas le cas utilise SwingUtilities.invokeAndWait() pour faire ton setText ..

    Bulbo

  9. #9
    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
    Citation Envoyé par mavina
    adiGuba mise a part ton stringbuffer a la place de mon string, c'est le meme code que mon premier post
    Justement ton problème venait de là ! En utilisant la concaténation de String avec + tu te retrouve à allouer des tonnes de mémoire pour rien... A chaque concatenation de String tu crées une nouvelle String, et donc tu alloues/desalloues de la mémoire... ce qui devient vite coûteux...

    Par exemple pour lire un fichier de 200 Ko (ce qui n'est pas énorme en soit), avec ton code tu vas allouer plus de 20 Go de mémoire (et même le double puisque les char sont codé sur 2 octets...).

    Pour preuve ce petit code :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            long size = 200000;    // taille du fichier à lire (200 Ko)
            long arraySize = 0; // taille de notre String (à 0 au début)
            long totalMemory = 0; // Taille total de la mémoire allouer
     
            // Tant que notre tableau ne fait pas la même taille que le fichier :
            while (arraySize<size) {
                // on aggrandit le tableau de 1
                arraySize++;
                // ce qui équivaut à créer un nouveau tableau et copier le contenu
                totalMemory += arraySize;
            }
            System.out.println("Pour un fichier de " + size + ", " + totalMemory + " 'char' seront utilisés...");
    Qui donne :
    Pour un fichier de 200000, 20000100000 'char' seront utilisés...
    C'est pour cela que ton application semble bloqué... le Garbage Collector travaille comme un malade...



    Citation Envoyé par mavina
    donc on va avoir le meme probleme, as tu testé ton code ?
    Oui et je peux t'assurer qu'il marche... Et je te retourne la question : as tu testé mon code ?
    Et j'en profite pour te rappeller que tu avais oublier de fermer le flux


    Enfin je n'ai pas dit que le code de scifire ne marchait pas (au contraire), mais il a toutefois un désavantage (mais assez minime) car il crée une nouvelle String à chaque ligne. Tu te retrouve donc a avoir alloué un StringBuffer pour la totalité du texte, plus une String par ligne (qui sera désalloué par le garbage collector). Ce qui implique une consommation de mémoire en plus (mais avec un fichier de 200Ko la différence ne se sent pas).

    Mais selon le format de ton fichier et sa taille tu peux ressentir une différence sur la consommation de mémoire...


    Enfin dernière remarque, la modification de ton composant graphique devrait se faire dans le Thread de l'EDT via SwingUtilities.invokeLater()

    a++

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

Discussions similaires

  1. fin d'un stream
    Par yacin87 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 02/04/2010, 11h37
  2. La fin d'un Fichier Stream!
    Par Sba3Net dans le forum VB.NET
    Réponses: 4
    Dernier message: 21/05/2007, 23h48
  3. Réponses: 2
    Dernier message: 25/07/2006, 14h11
  4. DirectSound et le streaming
    Par Shakram dans le forum DirectX
    Réponses: 57
    Dernier message: 09/06/2005, 12h05
  5. [BufferedInputStream] Détecter la fin du stream
    Par pmartin8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 02/06/2005, 16h57

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