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 :

Pb de boucle !


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut Pb de boucle !
    En gros je lis un fichier, qui contient par exemple:


    # xmcd

    #

    DISCID=c10ab60e

    DTITLE=Katherine Jenkins / Premiere

    TTITLE0=Java

    PLAYORDER=


    Ce qui est en bleu dans ce qui suit me permet d’afficher ce qui suit après DTITLE=
    Ce qui est en rouge est censé afficher ce qu’il y a après TITLE0= ,
    mais apparemment ca sort de la boucle dès que ca a trouvé ce qui est en bleu. Si vs savez pq, dites le moi !

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    package serveur;
     
    import java.net.*;
    import java.io.*;
     
    public class ClientThread extends Thread {
     
        private Socket socket;
        private static String START = "DTITLE=";
        private static String TTITLE0 = "TTITLE0=";
     
        /** Creates a new instance of ClientThread */
        public ClientThread(Socket clientSocket) {
            this.socket = clientSocket;
        }
     
        public void run()
        {
            try
            {
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     
                String s;
                String discId;
                discId = in.readLine();
                BufferedReader bf = new BufferedReader(new FileReader(discId));
     
                s = bf.readLine();
     
                while ((s = bf.readLine()) != null) {  
                   if (s.startsWith(START)) {
                   out.println("s est" + s.substring(START.length()));
                   }
                   if (s.startsWith(TTITLE0)) {
                   out.println("TITLE0 est " + s.substring(TTITLE0.length()));
                   }
                }
     
                System.out.println("Request for:" + discId);
                out.println("s est " + s);
                out.println("Answer");
     
                out.close();
                in.close();
                socket.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if (s.startsWith(TTITLE0)) {
    out.println("TITLE0 est " + s.substring(TTITLE0.length()));
    }
    est dans ta boucle

    Cela signifie que tu est arrive a la fin du fichier avant d'afficher le contenu de ta ligne.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Je suis pas sûr de comprendre, car si j'inverse les 2 if (...) {...}, c'est toujours le 1er if qui est excuté pas le 2ème.
    Même en créeant un autre while ca marche pas....

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    si tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ((s = bf.readLine()) != null) {
    out.println("[" + s + "]");
    }
    est-ce que tu as bien tout le contenu de ton fichier qui apparaît ligne par ligne?

  5. #5
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Non, j'ai [#] qui apparaît.

    ( en sachant que la 1ere ligne de mon fichier est # xmcd)

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Il t'affiche en fait la seconde ligne de ton fichier (#) car tu lis la première ligne de ton fichier avec s = bf.readLine(); juste avant ta boucle while. Ceci dit, je ne vois pas pourquoi il ne lit pas tout ton fichier...

    Si tu remplaces tous les out... par System.out... pour voir ce que ça donne, des fois que ce serait un pb réseau. Mets également des flush().

  7. #7
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Oui, ca marche, il lit bien tout le fichier avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((s = bf.readLine()) != null) {
                   System.out.println("[" + s + "]");
                }
    maintenant avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ((s = bf.readLine()) != null) {   
                   if (s.startsWith(START)) {
                   out.println("s est " + s.substring(START.length()));
                   }
                   if (s.startsWith(TTITLE0)) {
                   out.println("TITLE0 est " + s.substring(TTITLE0.length()));
                   }
    il semble qu'il assigne null à s dès qu'il a fini l'instruction out.println("s est " + s.substring(START.length()));

    Je cherche à y remédier pour pouvoir chercher et faire d'autre affichages. Une idée?
    Merci

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Par défaut
    Justement, qu'est-ce qu'il se passe si tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while ((s = bf.readLine()) != null) {
      if (s.startsWith(START)) {
        System.out.println("s est " + s.substring(START.length()));
      }
      if (s.startsWith(TTITLE0)) {
        System.out.println("TITLE0 est " + s.substring(TTITLE0.length()));
      }
    }
    pour voir ce qu'il se passe s'il n'utilise pas le socket.

    Si jamais ça marche, utilise un StringBuffer pour écrire tout ton message de sortie et fais un out.println(stringbuffer.toString()) à la fin.

  9. #9
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Oui! C'est bien ça le problème. Je tente de modifier mais je ne suis pas sûr de comment écrire le out.println(stringbuffer.toString()) à la fin: je mets z entre les parenthèses ?

    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
    StringBuffer z = null;
                discId = in.readLine();
                BufferedReader bf = new BufferedReader(new FileReader(discId));
     
                s = bf.readLine();
                /*while ((s = bf.readLine()) != null) {
                   System.out.println("[" + s + "]");
                }*/
                while ((s = bf.readLine()) != null) {   
                   if (s.startsWith(START)) {
                   z.substring(START.length());
                   }
                   if (s.startsWith(TTITLE0)) {
                   z.substring(TTITLE0.length());
     
                   out.println(stringbuffer.toString();
                   }
                }

  10. #10
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Essaye plutôt ce 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
    StringBuffer z = new StringBuffer();
                discId = in.readLine();
                BufferedReader bf = new BufferedReader(new FileReader(discId));
     
                s = bf.readLine();
     
                while ((s = bf.readLine()) != null) {   
                   if (s.startsWith(START)) {
                   z.append(s.substring(START.length())+"\n");
                   }
                   if (s.startsWith(TTITLE0)) {
                   z.append(s.substring(TTITLE0.length())+"\n");
                   }
     
                }
                 out.println(z.toString());
    @+


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  11. #11
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    avec ce 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
    String s;
                String discId;
                StringBuffer z = new StringBuffer();
                discId = in.readLine();
                BufferedReader bf = new BufferedReader(new FileReader(discId));
     
                s = bf.readLine();
                while ((s = bf.readLine()) != null) {   
                   if (s.startsWith(START)) {
                   z.append(s.substring(START.length())+"\n");
                   }
                   if (s.startsWith(TTITLE0)) {
                   z.append(s.substring(TTITLE0.length())+"\n");
                   }
                }
                System.out.println(z.toString());
                out.println(z.toString());
    mon serveur affiche bien les 2 lignes , mais mon client n'affiche toujours que la 1ère
    voici le client au cas où:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    package client;
     
    import java.io.*;
    import java.net.*;
    import org.omg.PortableInterceptor.DISCARDING;
     
    import sy22.coursework.cdtools.*;
     
    /**
     *
     * @author MaTT
     */
    public class Main {
     
        /** Creates a new instance of Main */
        public Main() {
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            Socket echoSocket = null;
            PrintWriter out = null;
            BufferedReader in = null;
            Disc disc = null;
            Drive drive = new Drive();
     
            try
            {
                disc = drive.read(); 
                System.out.println(disc.getId());
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
     
            if (disc == null)
            {
                System.out.println("No CD in drive.");
                System.exit(1);
            }
     
            try 
            {
                echoSocket = new Socket("localhost", 4444);
                out = new PrintWriter(echoSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
            } 
            catch (Exception e)
            {
                System.out.println("Cound not connect to server.");
                e.printStackTrace();
                System.exit(1);
            }
     
            try
            {
                out.println(disc.getId());
     
                String answer = in.readLine();
                System.out.println(answer);
     
                out.close();
                in.close();
                echoSocket.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
     
    }

  12. #12
    Membre habitué
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Par défaut
    Erreur identifiée, c'est bien dans le client où j'utilisais readline, ce qui fait que seule la 1ere ligne était affichée, je vais avoir le droit de faire une nouvelle boucle ;=

    Merci pour votre aide

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. [langage] if et boucle { ..}
    Par kacedda dans le forum Langage
    Réponses: 15
    Dernier message: 28/04/2003, 17h25
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  4. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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