Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1930 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  FLux de la console

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

FLux de la console

n°1207355
brasseldX
Posté le 26-09-2005 à 09:27:22  profilanswer
 

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...

mood
Publicité
Posté le 26-09-2005 à 09:27:22  profilanswer
 

n°1207373
nerisson
Pic-pic
Posté le 26-09-2005 à 09:44:52  profilanswer
 

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
n°1207375
brasseldX
Posté le 26-09-2005 à 09:46:29  profilanswer
 

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
n°1207526
nerisson
Pic-pic
Posté le 26-09-2005 à 13:20:39  profilanswer
 

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
n°1207529
brasseldX
Posté le 26-09-2005 à 13:27:17  profilanswer
 

C'est à dire ? Comment faire ?

n°1207588
nerisson
Pic-pic
Posté le 26-09-2005 à 14:15:54  profilanswer
 

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
n°1207591
brasseldX
Posté le 26-09-2005 à 14:19:45  profilanswer
 

ç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...

n°1207607
nerisson
Pic-pic
Posté le 26-09-2005 à 14:32:15  profilanswer
 

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
n°1207618
souk
Tourist
Posté le 26-09-2005 à 14:41:51  profilanswer
 

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.

n°1208587
brasseldX
Posté le 27-09-2005 à 14:34:02  profilanswer
 

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...

mood
Publicité
Posté le 27-09-2005 à 14:34:02  profilanswer
 

n°1208603
souk
Tourist
Posté le 27-09-2005 à 14:40:39  profilanswer
 

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

n°1208610
brasseldX
Posté le 27-09-2005 à 14:43:40  profilanswer
 

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 ??

n°1208617
souk
Tourist
Posté le 27-09-2005 à 14:46:11  profilanswer
 

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 ?

n°1208623
brasseldX
Posté le 27-09-2005 à 14:48:20  profilanswer
 

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

n°1208636
brasseldX
Posté le 27-09-2005 à 14:52:59  profilanswer
 

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...

n°1208640
souk
Tourist
Posté le 27-09-2005 à 14:54:03  profilanswer
 

[: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 ?

n°1208647
brasseldX
Posté le 27-09-2005 à 14:56:13  profilanswer
 

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.

n°1208663
souk
Tourist
Posté le 27-09-2005 à 15:00:37  profilanswer
 

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.

n°1208664
brasseldX
Posté le 27-09-2005 à 15:01:51  profilanswer
 

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

n°1208671
souk
Tourist
Posté le 27-09-2005 à 15:03:45  profilanswer
 

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

n°1208689
brasseldX
Posté le 27-09-2005 à 15:09:11  profilanswer
 

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
n°1208705
souk
Tourist
Posté le 27-09-2005 à 15:13:24  profilanswer
 

relis mes questions [:itm]

n°1208714
brasseldX
Posté le 27-09-2005 à 15:16:58  profilanswer
 

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).

n°1208748
souk
Tourist
Posté le 27-09-2005 à 15:32:05  profilanswer
 

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 ?

n°1208807
brasseldX
Posté le 27-09-2005 à 16:04:29  profilanswer
 

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.

n°1208832
souk
Tourist
Posté le 27-09-2005 à 16:17:29  profilanswer
 

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...

n°1208855
brasseldX
Posté le 27-09-2005 à 16:29:22  profilanswer
 

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)

n°1208869
nerisson
Pic-pic
Posté le 27-09-2005 à 16:34:51  profilanswer
 

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
n°1208894
brasseldX
Posté le 27-09-2005 à 16:41:36  profilanswer
 

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
n°1208960
souk
Tourist
Posté le 27-09-2005 à 17:09:25  profilanswer
 

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.

n°1209432
nerisson
Pic-pic
Posté le 28-09-2005 à 09:11:36  profilanswer
 

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
n°1209571
brasseldX
Posté le 28-09-2005 à 10:43:18  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  FLux de la console

 

Sujets relatifs
flux rss conversion devisesprobleme de flux rss . Les site en html peuvent pas l'afficher
Vfw : Ajouter un flux audio en MP3[VBA - Word]: Lancer une macro en mode console
Flux rss & débutantVirer la fenetre console
Enregistrer le flux video d'une caméra ipFlux RSS de hardware.fr
recherche fonctions equivalentes au C (entrée/sortie console)flux vers fichier ET vers console en même temps
Plus de sujets relatifs à : FLux de la console


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR