Bonjour,
Tout d'abord, je m'excuse d'avance pour les fautes d'accents, mais je me trouve sur un clavier qwerty...
Pour mon travail, je developpe une interface en Java, qui utilise des scripts externes censes etre utilises en Bash sous Linux/Unix.
Lorsque je lance un script, je redirige la sortie vers un textArea afin d'afficher le resultat a l'utilisateur. (en utilisant System.setOut... et en recuperant le inputStream).
Voici mon package qui me permet de lancer ma commande et recuperer l'output a la fin du processus :
Jusque la tout va bien, mais mon probleme est que certains scripts peuvent etre longs (tres longs), et j'aimerais rediriger la sortie de ces scripts vers mon textArea en temps reel afin que l'utilisateur soit informe de l'etat du script.
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 package Tools; import java.io.*; public class ExecuteThatCommand { String[] command = {"sh", "-c", null}; String errMsg; String outMsg; int outCode; static class PipeInputStreamToOutputStream implements Runnable { PipeInputStreamToOutputStream(InputStream is, OutputStream os) {is_ = is;os_ = os;} public void run() { try { byte[] buffer = new byte[1024]; for (int count = 0; (count = is_.read(buffer)) >= 0;) { os_.write(buffer, 0, count); } } catch (IOException e) {e.printStackTrace();} } private final InputStream is_; private final OutputStream os_; } public void prepare(String arg) { command[2] = arg; errMsg = null; outMsg = null; outCode = -1; } public void run() { ByteArrayOutputStream baosOut = new ByteArrayOutputStream(); ByteArrayOutputStream baosErr = new ByteArrayOutputStream(); try { final Process process = Runtime.getRuntime().exec(command); new Thread(new PipeInputStreamToOutputStream(process.getInputStream(), baosOut)).start(); new Thread(new PipeInputStreamToOutputStream(process.getErrorStream(), baosErr)).start(); outCode = process.waitFor(); } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); errMsg = sw.toString(); outMsg = "Java Errors append : "; outCode = -1; } outMsg = baosOut.toString(); errMsg = baosErr.toString(); } public String getCompleteMessage() {if (errMsg != null && outMsg != null) {return outMsg + errMsg;} else {return "";}} public String getErrMessage() {if (errMsg != null) {return errMsg;} else {return "";}} public String getOutMessage() {if (outMsg != null) {return outMsg;} else {return "";}} public int getOutCode() {return outCode;} }
En cherchant sur internet, j'ai trouve quelques solutions comme rediriger la sortie vers un fichier et lire le fichier (ce qui me parait un peu moche comme methode), ou bien des solutions qui ne fonctionnent pas en temps reel.
Auriez vous une idee a me soumettre afin de realiser cela?
Merci,
Raphael.
Partager