Problème à la lecture d'un fichier

drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006 - 6 juil. 2006 à 13:46
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006 - 7 juil. 2006 à 10:57
Bonjour à tous,


J'ai un problème très étrange. Mon programme pilote un autre programme
externe et lui fait créer un fichier "résultat". Lors que je veut
"parser" ce fichier résultat, j'ai une nullpointeurexception.

Si je fait :


           
           
jtextarea.append("Ouverture du fichier resultat :
"+file.getPath()+"_resultat.txt"+"\n");

           
            File
tempo = new File (file.getPath()+"_resultat.txt");


           
            boolean
tst = tempo.exists();

           
           
System.out.println(tst);   


Je constate que le chemin du fichier est bon.

Je sais que le fichier existe et n'est pas vide car je peux l'ouvrir
avec un éditeur de texte (donc mon programme externe a bien fait son
travail).

Pourtant le boolean est à false !! Java me dit que le fichier n'existe pas !


J'ai l'impression (stupide j'en convient) que à l'éxécution du
programme, la jvm prend une "capture" du contenu des dossiers et donc
quand je fait un .exists(); plutot que de demander à l'OS il utilise sa
"capture" et donc m'indique que le fichier n'existe pas (alors qu'entre
temps il a été créer ce fichier).


Mon code compile et ne fait pas de message d'erreur. Si je kill mon
programme et que je le relance, le boolean est à true (ce qui corrobore
ma théorie de la capture ???). C'est très étrange je n'y comprend
rien...


Quelqu'un aurait-il une explication ????

Y a t-il une instruction pour forcer la jvm à remettre à jour sa "capture", afin que je puisse ouvrir le fichier "résultat" ?

10 réponses

sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
6 juil. 2006 à 15:01
non l'histoire de capture je n'y crois pas
montre plus de code stp !!

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006
6 juil. 2006 à 15:21
Ok, mais je previens il y a beaucoup de code, donc je met simplement un extrait.


            String cheminfichierlp = file.getAbsolutePath();

            cheminfichierlp = cheminfichierlp+".lp";

           

            // Lecture du fichier ini indiquant la position du solver

            try

            {

                INIReader glpkpath = new INIReader();

                glpkpath.load("glpk.ini");

           
    String command = glpkpath.getProperty("Solver Path",
"glpkpath");

           
    command = command+" --cpxlp --output
"+file.getAbsolutePath()+"_resultat.txt "+cheminfichierlp;

           
    jtextarea.append("Le fichier ini a été lu."+"\n");

               

                // Code de lancement de glpk

                try

                {

           
        jtextarea.append("Lancement de
GLPK."+"\n");

           
        Process process =
Runtime.getRuntime().exec(command, null, null);

           
        StreamGobbler errorGobbler = new
StreamGobbler(process.getErrorStream());

           
        StreamGobbler outputGobbler = new
StreamGobbler(process.getInputStream());

                    errorGobbler.start();

                    outputGobbler.start();

           
        jtextarea.append("Le solver GLPK
a terminé le traitement du fichier script."+"\n");

           
        jtextarea.append("Les résultats
figurent dans le fichier <nom du fichier lp>_resultat.txt"+"\n");

                   

           
        // On parse le fichier resultat

                    try {

           
           
jtextarea.append("Ouverture du fichier resultat :
"+file.getPath()+"_resultat.txt"+"\n");

           
            File
tempo = new File (file.getPath()+"_resultat.txt");


           
            boolean
tst = tempo.exists();

           
           
System.out.println(tst);   

                       

------>        
    //BufferedReader buffer = new BufferedReader(new
FileReader(file.getPath()+"_resultat.txt"));

           
           
BufferedReader buffer = new BufferedReader(new FileReader(tempo));

                       

           
            String readStr;

           
            while
((readStr = buffer.readLine()) != null) {

                        int i;

           
           
    for (i=0; i<listevariable.size(); i++){

           
       
            Object
ref = listevariable.get(i);

           
       
            String
motif = (String) ref;

           
           
        boolean  b =
(readStr.indexOf(motif)> 0);

           
           
        if (b) {

           
       
           
    int start = 30;

           
       
           
    int end = 40;

           
       
           
    String substr = readStr.substring(start, end).trim();

           
       
           
   

           
       
           
    //L'objet est modifier Tree

           
       
           
    int id = Integer.parseInt(motif.substring(1,
motif.length()).trim());

           
       
           
    Node temp = new Node();

           
       
           
    temp = tree.getNode(id);

           
       
           
    temp.setDistanceToParent(Double.parseDouble(substr));

           
       
           
   

           
           
        }

           
           
    }

                   

                        }

           
           
jtextarea.append("La structure de l'arbre a été mise à jour. Nous vous
conseillons d'enregistrer"+"\n");

           
           
jtextarea.append("votre arbre au format nhx et de le
"re-charger"."+"\n");

           
           
jtextarea.append("Vous pourriez ainsi activer l'option "Longueur
réelles des branches"."+"\n");

           
           
save_button.setVisible(false);

                    }

                    catch ( Exception h ) {

           
           
jtextarea.append("ERREUR : Le fichier de sortie de GLPK n'a pas pu être
lu, ou est manquant."+"\n");

           
           
save_button.setVisible(false);

                    }

                }

                catch(Exception e){

       
           
jtextarea.append("ERREUR : Le solveur GLPK ne peut être lancé. Vérifier
que le chemin indiqué dans le fichier ini est valide."+"\n");

       
           
save_button.setVisible(false);

                }

            }

            catch (Exception e){

           
    jtextarea.append("ERREUR : Le solveur GLPK ne peut
être lancé. Le fichier glpk.ini indiquant son chemin est introuvable ou
illisible."+"\n");

                save_button.setVisible(false);

            }

         }


En gros voila ce que je fait : l'utilisateur indique un fichier ***.lp
dans lequel je fabrique mon script de calcul. J'utilise alors le
logiciel glpk (c'est un solveur d'équation) pour resoudre le problème
(extension lp car il est "codé" en lp), et j'indique à glpk que la
sortie doit se faire dans le fichier ***_resultat.txt

C'est quand je veut parser se fichier que ca marche pas. C'est au
niveau de la ligne indiqué par --------> que ca plante. Le
filereader n'arrive pas à ouvrir le fichier. Pourtant le chemin est
bon, mais comme je l'ai dit avant si je fait .exist() ben il me renvoie
faux. Du coup il sort du bloc "try" et m'affiche direct mon message
d'erreur ERREUR : Le fichier de sortie de GLPK n'a pas pu être lu, ou
est manquant.


En espérant que ce code supplèmentaire vouis aidera.

Perso j'avoue que ca me depasse !
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
6 juil. 2006 à 15:25
met des printStackTrace dans les catch
ca permettras de voir ton erreur

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006
6 juil. 2006 à 15:55
Voici ce que j'obtient dans la console :


java.io.FileNotFoundException: C:\Programmation\eclipse\workspace\Phylo\tztz_resultat.txt (Le fichier spécifié est introuvable)

    at java.io.FileInputStream.open(Native Method)

    at java.io.FileInputStream.(Unknown Source)

    at java.io.FileReader.(Unknown Source)


Je reste dubitatif. FileNotFoundException certe mais le fichier existe.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
6 juil. 2006 à 16:42
ben non il doit pas exister lol
sinon je vois pas pourquoi ca marcherais pas
essai de copier le path dans Explorer et voi si il t'ouvre le fichier texte ^^

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006
6 juil. 2006 à 16:56
Ca marche. Le fichier existe bien et le notepad ce lance. Mais bon ca je m'en doutait lol.

La question est : pourquoi ca ne marche pas ? Est-ce parce que le
fichier n'existe pas au moment où je lance le programme ? Est-ce parce
qu'il est créer par un programme externe ? Je pense parce que c'est un
fichier créer par le programme java ca pose pas de problème... Enfin
c'est très étrange.


J'ai essayer de créer un fichier vide, puis de lancer mon programme
externe en mettant le même nom que le fichier vide (donc il l'écrase).


Au niveau du : while ((readStr = buffer.readLine()) != null) {   il s'arrête car  readStr=null


Bizarre non ?

Personne n'as constaté ce genre de problème ????????

Merci de ton aide sheorogath, j'espère que d'autre prendrons le temps de tester, parce que là je sèche.[auteurdetail.aspx?ID=234347 ]
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
6 juil. 2006 à 16:57
Salut,


comment tu initialise ta variable "file" ?, tu met un chemin en dure?

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006
6 juil. 2006 à 17:16
J'ai trouvé !!!!!!!!!!


Le problème vient du fait que je pilote glpk et je parse le fichier
resultat dans le meme bloc d'instruction. Hors apparament  la
ligne

   Process process = Runtime.getRuntime().exec(command, null, null);

créer bien le processus mais le lance en parralèle et non en série.

En gros la jvm continue le traitement alors même que le logiciel
externe n'as pas forcément fini. Si je le force a faire une pause avec
un            
       
java.lang.Thread.currentThread().sleep(3000);

ca marche, j'arrive a ouvrir et parser le fichier resultats.


Merci quand même d'avoir prit le temps de me répondre sheorogath.
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
6 juil. 2006 à 21:20
Au lieu d'un sleep(3000), met un process.waitFor() : ça va attendre que le processus soit terminé pour continuer, et ça donnera les deux programmes "en série" comme tu le voulais

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
drakken_night Messages postés 6 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 7 juillet 2006
7 juil. 2006 à 10:57
Merci de ta réponse nightlord,


En effet j'ai mit un waitfor() (le sleep c'était juste pour tester),
surtout que selon la compléxité de l'arbre phylogénétique le script de
calcul peut mettre 50 milliseconde ou 3 minutes à etre résolu, lol.


En tout cas merci à tous d'avoir prit le temps de me répondre, c'est sympa
0
Rejoignez-nous