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 :
Passons, sur le fat que c'est un peu crade, je suis en plein debugage..
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); }
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 :
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.
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();
(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!
Partager