fin de processus lors d'acces fichier

fin de processus lors d'acces fichier - Java - Programmation

Marsh Posté le 03-08-2004 à 09:13:10    

Bonjour,
 
J'ai un probleme lorsque j'accede a un fichier (lecture ou ecriture). Le processus ne se termine pas lorsqu'on quitte mon application (uniquement si on a fait des "ouvrir" ou des "enregistrer" ).
 
Voici par exemple comment je m'y prends pour lire dans un fichier:
 

Code :
  1. String path = fc.getSelectedFile().getPath(); //fc est un FileChooser
  2. try {
  3.  FileReader fr = new FileReader(path);
  4.  BufferedReader br = new BufferedReader(fr);
  5.  //on recupere toutes les donnees:
  6.  FicheProduit produit = new FicheProduit();
  7.  (..) //appels a la methode readLine()
  8.  //fin de lecture du fichier
  9.  br.close();
  10.  fr.close();
  11.  return produit;
  12. }
  13. catch (Exception e){
  14.  //TODO erreur de lecture dans fichier
  15.  new MessageErreurLoad(path);
  16.  return old;
  17. }


 
J'ai bien fait des close comme vous  pouvez le voir. Si vous voyez pourquoi ca fait ca...
 
Merci d'avance


Message édité par ruready le 03-08-2004 à 09:14:07
Reply

Marsh Posté le 03-08-2004 à 09:13:10   

Reply

Marsh Posté le 03-08-2004 à 09:43:54    

ca n'a surement rien à voir avec la lecture du fichier...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-08-2004 à 09:47:42    

Et puis il faut mettre les close dans un clause (hi hi hi) finally pour être sûr de bien fermer les fichiers.


---------------
Light is right
Reply

Marsh Posté le 03-08-2004 à 10:01:44    

ben le truc c'est que j'ai ce probleme uniquement lors de l'acces au fichier alors je pense que ca viens de ca. (je parle du cas ou j'ai pas d'exception declanchée bien entendu)

Reply

Marsh Posté le 03-08-2004 à 11:14:20    

System.exit(0);
 
t'as essayé ?

Reply

Marsh Posté le 03-08-2004 à 11:24:01    

Ben quand je termine mon application: soit par un menu "quitter" ou par la croix, je fais un dispose().
 
... je vais essayer le System.exit(O)
 
... Ouais! ca marche! c'est cool, merci!
 
Mais je comprend pas pourquoi mon dispose() termine bien le processus lorsque je fais aucun acces aux fichiers mais pas dans le cas ou j'y accede... Enfin le principal c'est que ca marche maintenant.
 
Merci encore


Message édité par ruready le 03-08-2004 à 11:24:40
Reply

Marsh Posté le 03-08-2004 à 11:39:52    

ruready a écrit :

Mais je comprend pas pourquoi mon dispose() termine bien le processus lorsque je fais aucun acces aux fichiers mais pas dans le cas ou j'y accede... Enfin le principal c'est que ca marche maintenant.


Surement à cause de l'affichage de la fenêtre qui te permet de choisir le fichier.
Elle ne doit pas être "disposée". (faudrait vérifier dans les sources)
 
http://java.sun.com/j2se/1.4.2/doc [...] ssues.html

Citation :


Therefore, a stand-alone AWT application that wishes to exit cleanly without calling System.exit must:  

  • Make sure that all AWT or Swing components are made undisplayable when the application finishes. This can be done by calling Window.dispose on all top-level Windows. See Frame.getFrames.  
  • Make sure that no method of AWT event listeners registered by the application with any AWT or Swing component can run into an infinite loop or hang indefinitely. For example, an AWT listener method triggered by some AWT event can post a new AWT event of the same type to the EventQueue. The argument is that methods of AWT event listeners are typically executed on helper threads.  



une solution est de boucler sur toutes les frames (Frame.getFrames) en appelant dispose dessus ... c'est toujours plus propre qu'un System.exit(0)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-08-2004 à 13:37:35    

OK, merci, si j'ai le temps je ferais ca plus proprement en "disposant" la frame du filechooser (si ca vient bien de la) (d'ailleurs moi je dispose toutes mes frames alors...) Je trouve quand meme ca un peu bizarre que le la boite de dialogue du filechooser ne se dispose pas toute seule...
Je vous tiens au courant si j'en sais davantage...

Reply

Marsh Posté le 03-08-2004 à 13:47:29    

Bon j'ai essayé sur un exemple tout bete: une JFrame et un FileChooser.
 
Si je fais un dispose() en quittant ma JFrame, ca me laisse un processus.
 
Mais en faisant un dispose() de toutes les frames, ca fonctionne. J'ai fais comme tu m'as dit benou: Frame.getFrames() puis une boucle pour toutes les "disposer".
 
Conclusion: La boite de dialogue du JFileChooser ne se dispose pas a sa fermeture.
 
Merci pour ton aide benou!


Message édité par ruready le 03-08-2004 à 13:50:10
Reply

Marsh Posté le 03-08-2004 à 13:54:04    

benou a écrit :


c'est toujours plus propre qu'un System.exit(0)


 
En fait c'est quoi la difference? le System.exit(0) doit faire un dispose() de toutes les frames aussi, non?

Reply

Marsh Posté le 03-08-2004 à 13:54:04   

Reply

Marsh Posté le 03-08-2004 à 14:00:27    

ruready a écrit :

En fait c'est quoi la difference? le System.exit(0) doit faire un dispose() de toutes les frames aussi, non?


 
Le System.exit(...) termine la jvm en libérant toutes les resources occupées et en renvoyant le code passé en paramètre à l'appelant (windows ou un shell sous linux ou autre). Mais c'est un peu brutal. Y'a pas de dispose() appelé (peut-être que finalize() est appelé sur chaque objet en mémoire), la mémoire occupée est rendue à l'os.
En général, tu le mets en fin de main() pour sortir de la jvm.
 
la méthode main() est lancée dans son propre thread, quand elle se termine , son thread se termine mais si tu as d'autres threads que tu as lancés et que tu n'as pas arrêtés, la jvm peux continuer à tourner. le System.exit() assure qu'on termine la jvm, proprement si tu as fait le ménage avant, ou salement.

Reply

Marsh Posté le 03-08-2004 à 14:02:18    

ok merci pour ces precisions

Reply

Marsh Posté le 03-08-2004 à 14:38:17    

pascal34 a écrit :


En général, tu le mets en fin de main() pour sortir


 :??:  
 
ha bon ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-08-2004 à 14:41:47    

benou a écrit :

:??:  
 
ha bon ?


 
En général, tu souhaites sortir de la jvm quand ton main se termine.
 
Mais c'est pas une règle générale (cf GUI apps)

Reply

Marsh Posté le 03-08-2004 à 14:42:51    

on général, la jvm se termine tout seule en fin de main ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 03-08-2004 à 15:10:53    

benou a écrit :

on général, la jvm se termine tout seule en fin de main ...


 
Sauf si tu as une application graphique : le thread main se termine et seuls survivent les thread de gestion des evènements et les threads système (gc, ...)
 
ou
 
tu lances un autre thread depuis le main. la jvm ne se termine que si le thread en question se termine (si je me trompe pas).

Reply

Marsh Posté le 03-08-2004 à 22:46:33    

pascal34 a écrit :

Sauf si tu as une application graphique : le thread main se termine et seuls survivent les thread de gestion des evènements et les threads système (gc, ...)


ben oui, raison de plus pour pas foutre un System.exit(0) en bas du main  [:mlc]

Reply

Marsh Posté le 04-08-2004 à 09:58:19    

benou a écrit :

ben oui, raison de plus pour pas foutre un System.exit(0) en bas du main  [:mlc]


 
Dans ce cas c'est certain :D  
Faut le mettre ailleurs

Reply

Marsh Posté le 04-08-2004 à 11:13:11    

pascal34 a écrit :


Faut le mettre ailleurs


mais pkoi tu veux à tout prix le mettre ? :heink:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 04-08-2004 à 11:47:12    

benou a écrit :

mais pkoi tu veux à tout prix le mettre ? :heink:


 
Je veux pas à tout prix le mettre, mais ça aide parfois.
Dans son cas c'est utile : la méthode dispose() c'est pas à toi de l'appeler normalement !
S'il a fermé toutes les resources, fichiers et autres, il mettre un System.exit(0), pas besoin de passer derrière chaque Frame pour appeler dispose dessus.

Reply

Marsh Posté le 05-08-2004 à 09:10:26    

pascal34 a écrit :

Je veux pas à tout prix le mettre, mais ça aide parfois.


 
+1
 
Jusqu'a la j'en avais pas besoin mais dans certains cas comme ca c'est moins galere que de verifier que toutes les Frames se "disposent" bien.

Reply

Marsh Posté le 05-08-2004 à 10:09:10    

ruready a écrit :

+1
 
Jusqu'a la j'en avais pas besoin mais dans certains cas comme ca c'est moins galere que de verifier que toutes les Frames se "disposent" bien.


Tu pourrais montrer la partie de ton code qui utilise le JFileChooser ?
ca m'étonne cette histoire de dispose qui est pas appelé ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-08-2004 à 11:55:04    

benou a écrit :

Tu pourrais montrer la partie de ton code qui utilise le JFileChooser ?
ca m'étonne cette histoire de dispose qui est pas appelé ...


 

Code :
  1. public static FicheProduit load(FicheProduit old){
  2.  //on recupere toutes les données relatives au produit
  3.  JFileChooser fc = new JFileChooser();
  4.  fc.setDialogTitle("Ouvrir..." );
  5.  fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
  6.  //pour filtrer les fichier:        
  7.  ExampleFileFilter filter = new ExampleFileFilter();
  8.  filter.addExtension("bac" );
  9.  filter.setDescription("Plan de Bâche" );
  10.  fc.setFileFilter(filter);
  11.  int result = fc.showDialog(null, "Ouvrir" );
  12.  if (result == JFileChooser.CANCEL_OPTION)
  13.   return old;
  14.     else {
  15.   String path = fc.getSelectedFile().getPath();
  16.   try {
  17.     FileReader fr = new FileReader(path);
  18.     BufferedReader br = new BufferedReader(fr);
  19.     FicheProduit produit = new FicheProduit();
  20.     //on recupere toutes les donnees:
  21.     produit.setReferenceProduit(br.readLine());
  22.     produit.setReferenceClient(br.readLine());
  23.     produit.setNomClient(br.readLine());
  24.     produit.setDate(new Date(Long.parseLong(br.readLine())));
  25.     produit.setType(br.readLine());
  26.     //on recupere les donnees du plan:
  27.     produit.getPlan().load(br);
  28.     br.close();
  29.     fr.close();
  30.     System.out.println("Flag fin FicheProduit.load() ss erreur" );
  31.     return produit;
  32.   }
  33.   catch (Exception e){
  34.    //TODO erreur d'ouverture de fichier
  35.    System.err.println("Flag ERREUR FicheProduit.load()" );
  36.    System.out.println(e);
  37.    //TODO: afficher message d'erreur
  38.    return old; //on renvoie la fiche precedente
  39.   }
  40.     }
  41. }


 
voila

Reply

Marsh Posté le 05-08-2004 à 16:08:02    

J'ai regardé un peu, ca ressemble à un bug du jdk 1.3.
Voici le même extrait du source de JFileChooser en jdk 1.3 et 1.4 :  
 
JDK1.3.1_02


    public int showDialog(Component parent, String approveButtonText) {
 if(approveButtonText != null) {
     setApproveButtonText(approveButtonText);
     setDialogType(CUSTOM_DIALOG);
 }
 
        Frame frame = parent instanceof Frame ? (Frame) parent
              : (Frame)SwingUtilities.getAncestorOfClass(Frame.class, parent);
 
 String title = getUI().getDialogTitle(this);
 
        dialog = new JDialog(frame, title, true);
        Container contentPane = dialog.getContentPane();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(this, BorderLayout.CENTER);
 
        dialog.pack();
        dialog.setLocationRelativeTo(parent);
 
 rescanCurrentDirectory();
 
        dialog.show();
 return returnValue;
    }


 
JDK1.4.2_01


    public int showDialog(Component parent, String approveButtonText)
        throws HeadlessException {
 if(approveButtonText != null) {
     setApproveButtonText(approveButtonText);
     setDialogType(CUSTOM_DIALOG);
 }
 dialog = createDialog(parent);
 dialog.addWindowListener(new WindowAdapter() {
     public void windowClosing(WindowEvent e) {
  returnValue = CANCEL_OPTION;
     }
 });
 returnValue = ERROR_OPTION;
 rescanCurrentDirectory();
 
 dialog.show();
 dialog.dispose();
 dialog = null;
 return returnValue;
    }


 
en JDK1.4 y a un dialog.dispose(), pas en JDK1.3 ... ce qui explique le comportement de ton appli (si tu es bien en 1.3)


Message édité par benou le 05-08-2004 à 16:08:29

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-08-2004 à 16:10:56    

Jeu, Set et Match pour Benou

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed