FLux de la console

FLux de la console - Java - Programmation

Marsh Posté le 26-09-2005 à 09:27:22    

Tout d'abord bonjour,
Je voudrai savoir si il est possible de récupérer le flux qui arrive dans la console pour le récupérer. Car en fait je dois dvelopper une appli qui affiche la même chose dans la console ET dans une GUI.
Je ne sais pas trop comment faire...
Merci d'avance de votre réponse...

Reply

Marsh Posté le 26-09-2005 à 09:27:22   

Reply

Marsh Posté le 26-09-2005 à 09:44:52    

Il suffit de mettre ton propre objet de type PrintStream dans les variables System.out et System.err afin de rediriger les flux vers ton GUI.


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

Marsh Posté le 26-09-2005 à 09:46:29    

Oui ok, mais moi je veux les fluxs vers la console ET vers la GUI !!!
Si tu veux c'est un projet qui fait environ 2000 source .java donc je ne peux pas tout y modifier !!!


Message édité par brasseldX le 26-09-2005 à 09:51:03
Reply

Marsh Posté le 26-09-2005 à 13:20:39    

Rien ne t'empeche de renvoyer le flux vers la console et la GUI. Il faudra juste faire attention à ne pas boucler indéfiniment lorsque tu vas renvoyer et recevoir les message de la console.
Et puis tu n'as pas à modifier tes 2000 sources, il suffit de modifier les variables System.out et System.err au début de ton programme.


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

Marsh Posté le 26-09-2005 à 13:27:17    

C'est à dire ? Comment faire ?

Reply

Marsh Posté le 26-09-2005 à 14:15:54    

Tu créé une classe héritant de java.io.PrintStream (ou plus simple de java.io.OutputStream et tu utilises le constructeur aproprié de PrintStream) et tu surcharges les méthodes dont tu as besoin (les méthodes write).
Dans ces méthodes tu fait ce que tu veux avec les données que tu recois, dans ton cas tu peut les renvoyer vers ta GUI.
Ensuite tu créé 2 instances de cette classe que tu passes en paramètre des méthodes setErr() et setOut() de la class java.lang.System.
Et voila, maintenant tu as intercepté tout tes messages partant normalement vers la console.


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

Marsh Posté le 26-09-2005 à 14:19:45    

ça je l'avais déjà fait. Tous mes messages étaient bien intercepté pour aller vers la GUI mais je veux en plus, que ces messages aillent tout de même vers la console... Je veux un flux qui se dédouble pour aller ET vers la CONSOLE ET vers la GUI...

Reply

Marsh Posté le 26-09-2005 à 14:32:15    

Bon alors dans la classe tu as créé tu mets en paramètre du constructeur le flux que tu vas remplacer et tu le sauvegarde dans un coin. Ensuite a chaque fois que tu as un appel à une méthode write tu rappelle ton flux sauvegardé et ton appel au GUI.
Par exemple:

Code :
  1. class OutputInterceptor extends OutputStream {
  2.   private PrintStream ps;
  3.   public OutputInterceptor(PrintStream ps) {
  4.     this.oldStream = ps;
  5.   }
  6.   public write(byte[] b, int off, int len) {
  7.     /* vers la console */
  8.     oldStream.write(b, off, len);
  9.     /* vers le GUI */
  10.     ...
  11.   }
  12. }


Et au début de ton prog:
 

Code :
  1. OutputInterceptor interceptorOut = new OutputInterceptor(System.out);
  2. OutputInterceptor interceptorErr = new OutputInterceptor(System.err);
  3. System.setOut(interceptorOut);
  4. System.setErr(interceptorErr);


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

Marsh Posté le 26-09-2005 à 14:41:51    

perso je pense que c'est mal de changer les System.out et System.err
mieux vaut utiliser une classe qui dispatch les stream en amont de System.out et System.err qu'en aval.  
 
genre  

Code :
  1. class DispatchOutputStream extends OutputStream {
  2.     private List outputStreams;
  3.     public DispatchOutputStream(List outputDtreams){
  4.         this.outputStreams = outputDtreams;
  5.     }
  6.    
  7.    
  8.     public write(byte[] b, int off, int len) {
  9.         if(outputStreams == null) return;
  10.         for (int i = 0; i < outputStreams.size(); i++) {
  11.             OutputStream stream = outputStreams.get(i);
  12.             stream.write(b,off,len);
  13.         }
  14.     }
  15.    //etc avec les flush, close, et autres joyeusetés
  16. }


 
de la sorte on altère pas le comportement de System.out et System.err
 
cela dit le code ci-dessus n'est pas super joli non plus, c'est juste pour donner une idée.

Reply

Marsh Posté le 27-09-2005 à 14:34:02    

ET si il me faut un affichage en parallele des deux cotés ? Car avec vos méthodes l'affichage se fait les uns aprés les autres...

Reply

Marsh Posté le 27-09-2005 à 14:34:02   

Reply

Marsh Posté le 27-09-2005 à 14:40:39    

[:pingouino]
tu peux préciser tes propos ?

Reply

Marsh Posté le 27-09-2005 à 14:43:40    

Aves la méthode nerisson qui utilise l'objet OutputInterceptor, l'affichage se fait d'abord sur la console puis sur la GUI. Comment faire pour que ça s'affiche en paralléle, en même temps des deux côtés ??

Reply

Marsh Posté le 27-09-2005 à 14:46:11    

ben la avec les 2 solutions proposées, ca se fait quasi en meme temps, a un tableau de bits près [:pingouino]  
tu as besoin d'une simultanéité à la nanoseconde près ?

Reply

Marsh Posté le 27-09-2005 à 14:48:20    

Bah nan avec la premiére méthode ça m'affiche d'abord sur la console tout puis aprés la gui...

Reply

Marsh Posté le 27-09-2005 à 14:52:59    

Et même si je mets la gui avant la console, il va d'abord m'afficher un gros texte sur la console puis seulement aprés sur la gui...

Reply

Marsh Posté le 27-09-2005 à 14:54:03    

[:kiki] oui et non
effectivement c'est pas EXACTEMENT en meme temps, mais je doute que tu arrives a garantir que deux choses se passent en meme temps....
 
c'est quoi en meme temps pour toi ? tu as besoin que ce soit en meme temps à une nanoseconde pres, ou est-ce que une milliseconde de difference ca te suffit ?

Reply

Marsh Posté le 27-09-2005 à 14:56:13    

ben le millieme ça me suffit, même un peu plus, car là il m'affiche pendant environ 5 secondes dans ma console tout le baratin puis seulement aprés, il m'afiche la même chose dans la gui.

Reply

Marsh Posté le 27-09-2005 à 15:00:37    

ca ca vient de ton utilisation des streams, faut pas lui envoyer 3Go de données en meme temps. ensuite, tu peux essayer d'utiliser des BufferedOutputStream aussi.

Reply

Marsh Posté le 27-09-2005 à 15:01:51    

COmment je peux faire pour régler la taille des données envoyées ?

Reply

Marsh Posté le 27-09-2005 à 15:03:45    

comment tu fais actuellement ?
comment tu récupères les données ?
comment tu les transmets ?

Reply

Marsh Posté le 27-09-2005 à 15:09:11    

Code :
  1. package tools.JitsGui;
  2. import java.awt.Color;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.io.PrintStream;
  6. import javax.swing.text.SimpleAttributeSet;
  7. import javax.swing.text.StyleConstants;
  8. public class ConsoleOutput extends OutputStream{
  9. private JitsGui gui;
  10. private SimpleAttributeSet attr;
  11. private PrintStream ps;
  12. public ConsoleOutput(JitsGui gui) {
  13.  this.gui = gui;
  14.  ps = System.out;
  15.  attr = new SimpleAttributeSet();
  16.  StyleConstants.setFontSize(attr, 14);
  17.  StyleConstants.setForeground(attr, Color.GREEN);
  18. }
  19. public void write(byte[] b, int off, int len) {
  20.  String s = new String(b, off, len);
  21.  gui.addTextConsole(s, attr);
  22.  ps.write(b, off, len);
  23. }
  24. public void write(int b) throws IOException {
  25.  // TODO Auto-generated method stub
  26. }
  27. }


Et j'ai exactement la même chose pour la sortie d'erreur...
Ensuite je les apelle de cette maniére :

Code :
  1. package tools.JitsGui;
  2. import java.io.PrintStream;
  3. public class ConsoleRedir{
  4. private JitsGui gui;
  5. public ConsoleRedir(JitsGui gui) {
  6.  this.gui = gui;
  7.  streamRedirection();
  8. }
  9. public void streamRedirection() {
  10.  System.setOut(new PrintStream(new ConsoleOutput(getGui())));
  11.  System.setErr(new PrintStream(new ConsoleError(getGui())));
  12. }
  13. public JitsGui getGui() {
  14.  return this.gui;
  15. }
  16. }


 
Voilà...


Message édité par brasseldX le 27-09-2005 à 15:10:30
Reply

Marsh Posté le 27-09-2005 à 15:13:24    

relis mes questions [:itm]

Reply

Marsh Posté le 27-09-2005 à 15:16:58    

Comment je fais actuellement : je crée deux nouvelles objets. UN pour la sortie normal et un autre pour la sorti d'erreur. Chaque objet contient deux outputStream : le nouveau et l'ancien(celui par défaut).
Ensuite comment je récupére les données, c'est comme d'habitude, grâce à un system.out.println() qui m'envoie directement sur ma méthode write( byte b[], int off, int len). Ensuite je les transmet et à la gui puis à la console (car j'ai gardé l'ancien PrintStream).

Reply

Marsh Posté le 27-09-2005 à 15:32:05    

et tu envoies quoi comme données ? tu fais un System.out.println( une chaine de caractère de 3Go ) ?
est-ce qu'il y aurait pas moyen d'envoyer ces données par morceaux plutot qu'un gros truc ?

Reply

Marsh Posté le 27-09-2005 à 16:04:29    

Non je n'envoie pas de gros morceau. En fait j'utilise des scripts groovy que je balance et j'affiche le résultat du script dans la gui et dans la console. Et les system.out.println se font progressivement avec 1 ligne maxi à chaque fois.

Reply

Marsh Posté le 27-09-2005 à 16:17:29    

bah c'est pas normal, donc a mon avis c'est ton addTextConsole qui deconne et ta gui ne se mets pas bien a jour...

Reply

Marsh Posté le 27-09-2005 à 16:29:22    

Je viens d'essayer mais ça ne marche pas. Fait une boucle de 1 à 100 qui affiche une String dans un composant graphique sans afficher sur la console. Moi il me charge les 100 String puis il les affiche dans le composant (en l'occurence pour moi un JTextPane et un Document)

Reply

Marsh Posté le 27-09-2005 à 16:34:51    

souk a écrit :

bah c'est pas normal, donc a mon avis c'est ton addTextConsole qui deconne et ta gui ne se mets pas bien a jour...


+1


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

Marsh Posté le 27-09-2005 à 16:41:36    

Non ce n'est pas ça car j'ai fait un repaint juste derriére l'ajout de texte à mon document.
 
Il ne peut pas y avoir un probleme de Thread ? Car quand j'appuie sur mon bouton de la gui pour lancer le script,
le bouton reste bloqué, ainsi que la GUI, alors que pendant ce temps tout est écrit sur la console. Une fois que sur la console c'est fini alors le message s'affiche sur la gui.

Message cité 1 fois
Message édité par brasseldX le 27-09-2005 à 16:49:17
Reply

Marsh Posté le 27-09-2005 à 17:09:25    

brasseldX a écrit :

Non ce n'est pas ça car j'ai fait un repaint juste derriére l'ajout de texte à mon document.
 
Il ne peut pas y avoir un probleme de Thread ? Car quand j'appuie sur mon bouton de la gui pour lancer le script,
le bouton reste bloqué, ainsi que la GUI, alors que pendant ce temps tout est écrit sur la console. Une fois que sur la console c'est fini alors le message s'affiche sur la gui.


 
ben tu n'utilises pas swing comme il faut, tu fais tout ton boulot dans l'event dispatching thread de swing, du coup repaint ou pas repaint, ta gui ne se repaindra pas  [:spamafote]  
 
fais des recherches sur les methodes invokeLater et tu peux aussi trouver des trucs en cherchant SwingWorker sur le site de Sun.

Reply

Marsh Posté le 28-09-2005 à 09:11:36    

souk a écrit :

ben tu n'utilises pas swing comme il faut, tu fais tout ton boulot dans l'event dispatching thread de swing, du coup repaint ou pas repaint, ta gui ne se repaindra pas  [:spamafote]  
 
fais des recherches sur les methodes invokeLater et tu peux aussi trouver des trucs en cherchant SwingWorker sur le site de Sun.


re +1  :D


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

Marsh Posté le 28-09-2005 à 10:43:18    

ok mais je ne vois pas du tout comment utiliser ça pour gérer les fluxs en paralléle. Car je ne peux pas passé de parametre avec invokeLater ou SwingWorker.
De plus, le SwingWorker est plus adapté.
 
Mais mon probléme c'est le passage de paramétre car je veux faire ça :

Code :
  1. package tools.JitsGui;
  2. import java.awt.Color;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.io.PrintStream;
  6. import javax.swing.text.SimpleAttributeSet;
  7. import javax.swing.text.StyleConstants;
  8. public class ConsoleOutput extends OutputStream{
  9. private JitsGui gui;
  10. private SimpleAttributeSet attr;
  11. private PrintStream ps;
  12. public ConsoleOutput(JitsGui gui) {
  13.  this.gui = gui;
  14.  ps = System.out;
  15.  attr = new SimpleAttributeSet();
  16.  StyleConstants.setFontSize(attr, 14);
  17.  StyleConstants.setForeground(attr, Color.GREEN);
  18. }
  19. public void write(byte[] b, int off, int len) {
  20.         /* quand j'ajoute qqch sur les sorties
  21.                  * je crée un SwingWorker pour la gui au moment de l'appel à gui.addText....
  22.                  * Mais comment passer les paramétres s et attr à la méthode ???
  23.                  */
  24.  String s = new String(b, off, len);
  25.  gui.addTextConsole(s, attr);
  26.  ps.write(b, off, len);
  27. }
  28. public void write(int b) throws IOException {
  29.  // TODO Auto-generated method stub
  30. }
  31. }


Message édité par brasseldX le 28-09-2005 à 10:49:43
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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