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

Langage Java Discussion :

Lire un fichier


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut Lire un fichier
    Bonjour,

    J'ai crée un programme graphique avec Swing. Il me permet d'afficher un tableau de valeurs. Ce tableau est de dimension 2, sa première colonne sert à indiquer les instants d'observation et la deuxième colonne reprend les mesures prises à ces instants.

    Je voudrais améliorer l'application en proposant - dans un premier temps - de charger un fichier. Pour cela, j'utilise un JFileChooser afin de permettre à l'utilisateur de choisir son fichier.

    Voici la structure d'un tel fichier (ici correspond à la fonction sinus entre -pi et pi):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Size 10
    -3.1415927 4.641020666628482E-8
    -2.443460988888889 -0.6427875820347647
    -1.7453292777777778 -0.9848077485349589
    -1.0471975666666666 -0.866025411519473
    -0.3490658555555557 -0.34202014817137205
    0.3490658555555557 0.34202014817137205
    1.0471975666666666 0.866025411519473
    1.745329277777778 0.9848077485349589
    2.4434609888888885 0.642787582034765
    3.1415927 -4.641020666628482E-8
    La première ligne indique la taille du fichier (nombre de lignes suivantes). Ensuite, pour chaque ligne, on a d'abord l'instant de mesure, puis la mesure. Les deux nombres sont séparés par un espace.

    Pour afficher ce tableau graphiquement, je dois prendre chaque ligne du fichier grâce à la méthode NextLine() de la classe Scanner. Pour chaque appel de cette méthode, je dois séparer les deux nombres (1 correspondant à l'instant d'observation, l'autre à la mesure) sans doute avec la méthode split de la classe String, les convertir en double(avec Double.parseDouble(String ...), puis créer mon tableau de dimension 2 (en fait, il est de type DataSetIF, mais c'est pas un prob à ce niveau là car j'ai déjà le constructeur qu'il faut pour créer mon tableau de dim2).


    J'essaye d'employer la classe Scanner et pas les BufferedReaders, StringTokenizers,...

    En clair: J'ai un fichier de type particulier que je veux lire afin de créer 2 tableaux de type double. Le premier tableau indique les instants de mesures, le 2ème les mesures prises à ces instants.

    Dès que j'ai ces 2 tableaux, j'ai ce qu'il faut pour afficher le fichier graphiquement.


    Voici le code de ma méthode "charger" que j'ai généré, mais il ne fonctionne pas
    J'ai pourtant réfléchi pendant longtemps...

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    /**
         * Méthode permettant de charger un DataSet depuis un fichier dans le répertoire courant
         * en  utilisant le format défini par Walbot (.dat)
         * 
         * @pre: - 
         * @post: crée un nouveau DataSet dont les valeurs correspondent à celles se trouvant dans le fichier .dat
         * 
         */
     
     public static DataSetIF charger(String file){ 
     
        try{
     
         // DEBUT PARTIE GRAPHIQUE
     
     
          //création d'une fenêtre contenant une zone de texte pour afficher le fichier souhaité (c'est pas encore l'affichage dans la zone graphique!)
     
            JFrame frame = new JFrame("Contenu du fichier");
     
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            JTextArea texte = new JTextArea(20,30);
     
            //création du JFileChooser permettant de sélectionner un fichier de manière "interactive"
     
            JFileChooser chooser = new JFileChooser();
     
            //titre de la fenêtre générée par le JFileChooser
     
            chooser.setDialogTitle("Charger un graphe...");
     
            //statut du JFileChooser
     
            int status = chooser.showOpenDialog(null);  //Pops up an "Open File" file chooser dialog (par défaut, n'affiche rien: null!)
     
            //procédure si un fichier n'est sélectionné (approuvé):
     
            if(status!= JFileChooser.APPROVE_OPTION) texte.setText("Aucun fichier choisi");
     
            //dans les autres cas, on affiche le contenu du fichier dans la fenêtre ET dans la zone graphique
     
            else{ 
     
                File myfile = chooser.getSelectedFile();
                Scanner scan = new Scanner(myfile);
                String info = "";
                while(scan.hasNext()){
                     info += scan.nextLine() + "\n";    
     
    //nextLine(): Advances this scanner past the current line and returns the input that was skipped. 
     
                    }   
     
     //This method returns the rest of the current line, excluding any line separator at the end.
     
     //The position is set to the beginning of the next line. 
     
     
              texte.setText(info); 
     
              //combien de ligne y a t'il dans le fichier?
     
              int nblignes = scan.nextInt();
     
     
     
     
               //IL FAUT MAINTENANT CREER UN DATASETIF A PARTIR DU FICHIER
     
     
              String ligne = "";
              int indice = 0;
              String[] nombre = new String[2];
     
     
              double[] tab1 = new double[nblignes];  //tableau pour les instants de mesures
              double[] tab2 = new double[nblignes];  //tableau pour les mesures
     
     
              while(scan.hasNext()){
     
                    ligne = scan.nextLine();  //on prend la ligne suivante du fichier
     
                    nombre = ligne.split(" ");
     
                    tab1[indice] = Double.parseDouble(nombre[0]);
                    tab2[indice] = Double.parseDouble(nombre[1]);
     
                    indice++;
     
            }//fin de while
     
     
            //création du DataSetIF
     
            DataSetIF mydata = new DataSet(tab1,tab2);
     
          //IL FAUT MAINTENANT CHARGER TOUT LE FICHIER DANS LA ZONE   GRAPHIQUE!
     
          JPlot j = new JPlot(mydata);
     
            }//fin de else
     
     
           //on ajoute la boite de texte au contenu de la petite fenêtre Jframe: le contenu du fichier (chiffres...) est affiché 
     
           frame.getContentPane().add(texte);
           frame.pack();
           frame.setVisible(true);
     
     
        }//fin de try 
     
        catch(IOException e){
     
            System.exit(-1);
     
            //traitement de l'exception de type IOException pouvant être lancée 
     
        }
     
        return mydata;
     
        }//fin de la méthode charger


    Merci beaucoup pour votre aide!

    Sébastien

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    il ne fonctionne pas c'est a dire ?
    il ne compile pas ?
    il sort une exception si oui laquelle ?
    il execute mais pas comme tu le souhaites ? si oui comment

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 58
    Par défaut
    Salut,

    En fait, le programme compile parfaitement. Pour info, voici la fenêtre de mon programme:


    http://img56.imageshack.us/img56/284...aphiquegg9.jpg


    C'est à l'exécution que tout foire...


    Lorsque je clique sur "charger", une boîte de dialogue apparaît (c'est le JFileChooser). Je choisis mon fichier (normal.dat), et je clique sur "Ouvrir".

    Et là, je reçois pleins d'exceptions en pleine figure...

    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
    Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
    	at java.util.Scanner.throwFor(Scanner.java:817)
    	at java.util.Scanner.next(Scanner.java:1431)
    	at java.util.Scanner.nextInt(Scanner.java:2040)
    	at java.util.Scanner.nextInt(Scanner.java:2000)
    	at Pr7.DataSetUtil.charger(DataSetUtil.java:252)
    	at Pr7.JPlot$existListener.actionPerformed(JPlot.java:195)
    	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    	at java.awt.Component.processMouseEvent(Component.java:5488)
    	at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
    	at java.awt.Component.processEvent(Component.java:5253)
    	at java.awt.Container.processEvent(Container.java:1966)
    	at java.awt.Component.dispatchEventImpl(Component.java:3955)
    	at java.awt.Container.dispatchEventImpl(Container.java:2024)
    	at java.awt.Component.dispatchEvent(Component.java:3803)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    	at java.awt.Container.dispatchEventImpl(Container.java:2010)
    	at java.awt.Window.dispatchEventImpl(Window.java:1766)
    	at java.awt.Component.dispatchEvent(Component.java:3803)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

    ps: c'est l'affichage graphique de mon tableau (venant du fichier) qui foire, parce que la petite zone de texte que j'ai crée (avant d'essayer d'afficher le contenu du fichier) fonctionnait très bien...donc c'est à partir du moment où j'affiche ce commentaire que rien ne vas plus:

    //IL FAUT MAINTENANT CREER UN DATASETIF A PARTIR DU FICHIER

    Je précise que le DataSetIF correspond en fait à l'objet de ce type que je dois créer : c'est un tableau de dimension 2 et de ce type, regroupant les instants de mesures (première colonne) et les mesures (2ème colonne).

    Donc, dès que j'ai ces 2 fameux tableaux, j'invoque un certain constructeur (sa signature est : DataSet(double t[], double m[]) )qui me fait le DataSetIF! Il n'y a pas de problème avec ce constructeur, il marche très bien.


    Merci encore pour votre aide!!!

    Sébastien

Discussions similaires

  1. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26
  2. [MFC] lire un fichier en int
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 09h32
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

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