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 :

Lire un fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Lire un fichier texte
    Bonjour à tous,

    J'ai un fichier texte dans lequel j'ai sauvegardé les valeurs des différents attributs de mes objets. Exemple : j'ai une classe Client qui a 2 attributs : String login et String mdp donc si j'ai entré un client qui a pour login "toto" et pour mdp "tata" j'ai dans mon fichier texte : "toto tata". J'aimerais, en lisant ce fichier sauvegarde, réattribuer les valeurs toto et tata respectivement aux attributs login et mdp. Cependant, je ne sais manipuler que les Fichiers et non pas les Streams.

    J'espère avoir été clair x)

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Tu trouvera dans les FAQ Java tout ce qui t'es nécessaire pour lire ton fichier texte :
    Comment lire un fichier ligne par ligne ?
    Pour ce qui est de l'affectation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String line, login, pass;
    // Affecation pour la démonstration
    line = "toto tata";
    login = line.split(" ")[0]; // toto
    pass = line.split(" ")[1]; // tata
    Tu ne devrais pas avoir de problème à lier les deux.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour kolodz,

    Merci de ton aide, j'étais parvenu à la même solution à savoir utiliser split seulement lorsque j'exécute j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.ArrayList.subList(ArrayList.java:955)
    	at java.lang.String.split(String.java:2311)
    	at java.lang.String.split(String.java:2355)
    	at projetcpo.listeClients.charger(listeClients.java:72)
    	at projetcpo.Camping.chargerclient(Camping.java:51)
    	at projetcpo.ProjetCPO.main(ProjetCPO.java:40)
    Java Result: 1

  4. #4
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Peut-on voir ton code ?
    Il semble que Java manque de mémoire pour générer les nouveaux String. C'est possible, mais pas sur un petit fichier. Il faudrait que celui-ci soit conséquent ou qu'il y ai une boucle infini !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Oui j'ai essayé d'allouer plus de mémoire à la JVM dans les propriétés du projet mais ça ne change rien :/

    Voici la méthode charger qui appelle split:
    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
    public void charger() throws IOException{
              try{
              FileReader fich = new FileReader(sauvegardeClients);
              BufferedReader br = new BufferedReader(fich);
              String ligne = br.readLine(), login, mdp;
              while(ligne != null){
                  login = ligne.split("/")[0];
                  mdp = ligne.split("/")[1];
                  Client c = new Client(login, mdp);
                  liste1.add(c);
                  br.close();
              }
              fich.close();
              }catch(IOException ex){
                  System.out.println("Chargement non fait");
              }
          }

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    tu pourrais nous décrire quand est-ce que la boucle while() s'arrête ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Elle s'arrête quand la ligne suivante dans le fichier texte est vide?

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Euh.... Okay.

    Et tu pourrais nous expliquer comment ça marche ?

    Par exemple je vois pas le rapport entre ligne != null et la prochaine ligne. Là comme ça, ça ressemble plus à la ligne actuelle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
              String ligne = br.readLine(), login, mdp;
    Je te donne mon avis sur cette ligne...
    Déclarer plusieurs variables sur une ligne, c'est moche, mais les déclarer et les instancier sur une seule ligne c'est encore pire !
    Question de lisibilité, essaye toujours de séparer tes déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              String ligne = br.readLine()
              String login;
              String mdp;

    Ici, tu as une chaine que tu découpes deux fois exactement de la même façon : pourquoi ne pas la découper qu'une seule fois ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              login = ligne.split("/")[0];
              mdp = ligne.split("/")[1];
    A transformer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              String[] splitted = ligne.split("/");
              login = splitted[0];
              mdp = splitted[1];

    Et dernier point, la condition de sortie de ta boucle n'est pas bonne : dans le code actuel, tu vas remplir ta liste avec toujours la première ligne de ton fichier source... En boucle... A l'infini. D'où l'erreur.
    Faut juste que tu oublie pas de relire la ligne d'après à la fin de ta boucle (ou dans la déclaration de la boucle avec une syntaxe que je trouve horrible mais qui est utilisée partout) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	while ((ligne = br.readLine()) != null){
    		// boucle
    	}

    SPOILER ALERT : à l'exécution, si tu changes que ça, tu vas encore avoir un problème à l'exécution ^^
    Je ne suis pas mort, j'ai du travail !

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Salut eulbobo,

    Merci beaucoup pour ton aide, j'ai modifié mon code ainsi :
    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 charger() throws IOException{
              try{
              FileReader fich = new FileReader(sauvegardeClients);
              BufferedReader br = new BufferedReader(fich);
              String ligne = br.readLine();
              String login;
              String mdp;
              while(ligne != null){
                  String[] splitted = ligne.split("/");
                  login = splitted[0];
                  mdp = splitted[1];
                  Client c = new Client(login, mdp);
                  liste1.add(c);
                  ligne = br.readLine();
              }
              fich.close();
              }catch(IOException ex){
                  System.out.println("Chargement non fait");
              }
          }
    et ça a l'air de fonctionner

  11. #11
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    eulbobo te proposait une version de la boucle un peu plus propre :
    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
    public void charger() throws IOException{
              try{
              FileReader fich = new FileReader(sauvegardeClients);
              BufferedReader br = new BufferedReader(fich);
              String ligne;
              String login;
              String mdp;
              while ((ligne = br.readLine()) != null){
                  String[] splitted = ligne.split("/");
                  login = splitted[0];
                  mdp = splitted[1];
                  Client c = new Client(login, mdp);
                  liste1.add(c);
              }
              fich.close();
              }catch(IOException ex){
                  System.out.println("Chargement non fait");
              }
          }
    L'idée étant de bien avoir la lecture de la nouvelle ligne et le test au niveau de la structure while et non dans le code interne au while.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2005, 15h57
  2. [Applet] lire un fichier texte
    Par lebesnec dans le forum Applets
    Réponses: 2
    Dernier message: 07/07/2005, 10h09
  3. Réponses: 1
    Dernier message: 24/11/2004, 16h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 15h22
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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