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

Java Discussion :

Flux de sortie, lecture de fichier


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut Flux de sortie, lecture de fichier
    Bonjour à tous,

    J'ai un gros problème avec la lecture de mes flux de sortie, j'aurais bien besoin d'un peu d'aide...

    Voilà ce que je voudrais faire :

    1) je lance mon programme java (création des données)
    2) je lance un programme externe (un algorithme sur une application externe)
    3) je récupère la sortie de l'application externe
    4) je réalise des traitements sur la sortie et je recommence au 2.


    Voilà l'idée générale.
    Avant d'aller plus loin, j'ajoute que j'ai regardé le tuto d'Yann D'ISANTO.

    Voilà comment je lance mon application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    final String path = System.getProperty("user.dir");
     
    		try {
    			Runtime runtime = Runtime.getRuntime();
    			final Process process = runtime.exec(
    					"C:/Users/Tanguy/Desktop/glpk-4.45/w32/glpsol " +
    					"--data " + path +"/data.dat " +
    					"--model " + path +"/lns3.mod " +
    					"--output " + path +"/PLNE_RESULTS.txt"
    			);
    }catch(Exception e){
    System.out.println(e);
    }
    Passons, sur le fat que c'est un peu crade, je suis en plein debugage..
    Il y a deux choses à noter :
    1) je ne passe pas par un tableau pour donner les paramètres de l'appli (sinon ca ne marche plus...?)
    2) je sauvegarde la sortie sur un fichier texte.

    Mon problème c'est que le programme marche plus ou moins bien de manière aléatoire (sur les mêmes données, sans aucun traitement aléatoire). Du coup j'ai soupçonné une erreur de gestion de flux.... Parfois il arrive à écrire la sortie avant de la lire, et parfois non...

    Du coup j'ai essayé de gérer les flux de cette manière :
    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
     
    // Consommation de la sortie standard de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						//int[] results = ParserGLPK.obtenirResult(path + "/PLNE_RESULTS.txt", nbTowns, true);
    						BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    						String line = "";
    						try {
    							while((line = reader.readLine()) != null) {
    								System.out.println(line);
    								// Traitement du flux de sortie de l'application si besoin est
    							}
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
     
    			// Consommation de la sortie d'erreur de l'application externe dans un Thread separe
    			new Thread() {
    				public void run() {
    					try {
    						BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    						String line = "";
    						try {
    							while((line = reader.readLine()) != null) {
    								// Traitement du flux d'erreur de l'application si besoin est
    							}
    						} finally {
    							reader.close();
    						}
    					} catch(IOException ioe) {
    						ioe.printStackTrace();
    					}
    				}
    			}.start();
    En regardant un peu l'affichage, je me suis rendu compte que je ne pouvais pas récupérer la sortie de mon application directement dans la sortie standard.
    (la dernière ligne écrite dans la console est :
    Writing MIP solution to `C:\Users\Tanguy\workspace\ROP/PLNE_RESULTS.txt'...)

    Du coup, comment est ce que je peux faire pour attendre que PLNE_RESULTS.txt soit totalement renseigné avant d'aller y lire les infos dont j'ai besoin??

    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Du coup, comment est ce que je peux faire pour attendre
    que PLNE_RESULTS.txt soit totalement renseigné
    avant d'aller y lire les infos dont j'ai besoin??
    as-tu essayé d'attendre la fin explicite de l'application en faisant :
    process.waitFor();
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    J'ai essayé de trois manières :

    1) avant la récupération des flux : le programme bloque
    2) après la récupération des flux : le programme bug
    3) sans récupérer les flux : le programme bloque

    ...Ca a l'air de changer quelque chose, mais je ne vois pas trop comment l'utiliser...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    il faut, dans l'ordre

    1) lancer le programme externe
    2) traiter ses flux (que ce soit en les lisant dans des thread séparés ou en les fermant)
    3) attendre la fin de votre programme (avec Process.waitFor())

  5. #5
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Si j'ai bien compris, tu veux faire :
    1) lancer l'application externe "glpsol" qui génère le fichier "PLNE_RESULTS.txt"
    2) attendre que l'application ai terminé pour être sûr que le fichier soit bien généré.
    3) probablement ouvrir ce fichier pour en faire quelque chose.

    Vu de ma fenêtre, cela donnerait :
    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
    final String path = System.getProperty("user.dir");
    try {
        Runtime runtime = Runtime.getRuntime();
        final Process process = runtime.exec(
            "C:/Users/Tanguy/Desktop/glpk-4.45/w32/glpsol " +
            "--data " + path +"/data.dat " +
            "--model " + path +"/lns3.mod " +
            "--output " + path +"/PLNE_RESULTS.txt"
        ); // lancement de glpsol 
        process.waitFor(); // blocage du programme java en attendant que process soit fini.
        File resultat = new File(path +"/PLNE_RESULTS.txt"); // récup du fichier
     
        // ... exploiter ici le contenu du fichier "resultat" 
     
    }catch(Exception e){
    System.out.println(e);
    }
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  6. #6
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Au final je me retrouve avec ca :

    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
     
    final String path = System.getProperty("user.dir");
    		try {
    			Runtime runtime = Runtime.getRuntime();
    			final Process process = runtime.exec(
    					"C:/Users/Tanguy/Desktop/glpk-4.45/w32/glpsol " +
    					"--data " + path +"/data.dat " +
    					"--model " + path +"/lns3.mod " +
    					"--output " + path +"/PLNE_RESULTS.txt"
    			);
    			process.getInputStream().close();
    			process.getErrorStream().close();
    			process.waitFor();
     
    			int[] results = ParserGLPK.obtenirResult(path + "/PLNE_RESULTS.txt", nbTowns, true);
    			return results;
    		}catch(Exception ex){
    			System.err.println("ERREUR");
    		} 
    		System.err.println("Echec de la lecture des résultats");
    		return null;
    Est ce que cela vous semble correct?

    Edit : sans les deux close, le programme bloque, avec, il avance, mais bug.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    sans les deux close, le programme bloque, avec, il avance, mais bug
    Je me demande si glpsol n'attend pas une réponse de l'utilisateur quelque part.
    Ce qui ferait que getInputStream().close() ne serait pas de son goût.

    Si tu le lances en dehors de ton programme java (dans un batch par exemple)
    est-ce qu'il s'exécute sans problème et sans poser de question ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  8. #8
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    En fait le programme externe n'a besoin d'aucune intervention, mais en faisant quelques tests console, j'ai remarqué que le programme ne trouvait pas toujours de solution, ce qui explique qu'il n'arrive pas à renseigner le txt...

    Cela ne se produit que de temps en temps, c'est pour ca que je ne l'ai pas vu...
    A priori, l'erreur se situe du côté des entrées du programme extérieur, je vais regarder ca.

    Merci de votre aide.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    path pouvant contenir et contenant surement des espace, utiliser la version de exec prenant en paramètre un tableau de string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    			final Process process = runtime.exec(new String[] {
    					"C:/Users/Tanguy/Desktop/glpk-4.45/w32/glpsol ",
    					"--data ", path +"/data.dat " +
    					"--model " , path +"/lns3.mod " +
    					"--output " , path +"/PLNE_RESULTS.txt"}
    			);

  10. #10
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 98
    Points
    98
    Par défaut
    Oui, j'ai bien noté ce petit souci, mais curieusement, avec un tableau de string, cela ne marche plus...

    Edit :

    En tout cas je crois que je n'ai plus de problème avec mes flux...
    Merci beaucoup.

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

Discussions similaires

  1. [Débutant] lecture de fichier : mettre le flux au debut
    Par Sanyika dans le forum C#
    Réponses: 1
    Dernier message: 09/12/2012, 02h11
  2. Lecture de fichier ou flux XML
    Par olibara dans le forum C#
    Réponses: 4
    Dernier message: 12/12/2008, 18h18
  3. Réponses: 17
    Dernier message: 07/05/2008, 11h16
  4. fichier et flux de sortie!
    Par Arcann dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 09/08/2007, 14h54
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 10h43

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