Bonjour,
j'ai une méthode qui attend un outputStream.
J'aimerais donc en créer un, puis lire son contenu "rempli" par ma méthode.
Auriez vous des idées ?
Bonjour,
j'ai une méthode qui attend un outputStream.
J'aimerais donc en créer un, puis lire son contenu "rempli" par ma méthode.
Auriez vous des idées ?
En te rendant sur la javadoc tu peux te rendre compte que OutputStream est une classe abstraite mère d'autres classes qui te permettront de lire facilement certains type de données.
Donc cela dépend de ce que tu veux faire.
Par exemple en utilisant la classe BufferedOutputStream tu pourras écrire tes données en utilisant un tampon.
Une distinction est à faire au départ:
- Writer : écrire des données de type caractères
- OutputStream : écrire des données de type binaire
Suivant tes besoins tu pourras certainement trouver dans la javadoc la classe (étendant l'une de ces 2 classes abstraites) qui te convient le mieux
j'aimerais préciser (même si ca a du se voir que je débute un peu avec les I/O)
J'avais consulter la java doc avant de poser la question, mais elle ne m'avait pas bien aidée... (ou alors, je n'ai pas su exploiter les informations fournies).
Car en effet, le bufferedoutputstream m'intéressait pas mal, mais son constructeur requiert... un outputstream !! (et me revoila au point de départ )
donc je t'explique ce que je souhaite faire : J'aimerais lire l'outputstream que me rempli l'application et l'exploiter, c'est à dire faire des recherche dans la chaine de caractère que je souhaite récupérer.
Pour l'instant, le outputstream défini est System.out, et je vois les résultats affichés sur ma sortie standard (la console d'eclipse ).
Maitenant, comment faire pour récupérer ce que je vois ?
Le départ avec les IO n'est pas forcément facile, mais ce paquage est très bien fait, et je te conseille de faire l'effort de bien le comprendre.
Pour pouvoir récupérer facilement le contenu d'un OutputStream tu peux utiliser un ByteArrayOutputStream, de cette façon approximative :
Cependant, méfie toi que j'ai sans doute répondu un peu trop directement à ta question Il y a certains problèmes dont tu sembles ne pas avoir conscience Les remarques de Pollux sont très pertinentes !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 out = new ByteArrayOutputStream(); // possible puisque ByteArray... est une classe concrète laMethodeQuiRemplitLeFlux(out); byte[] rempli = out.toByteArray(); ... utilisation de rempli ...
N'hésites pas à poser d'autres questions, on sait que les départs peuvent être durs.
Merci à vous pour vos réponses,
mais j'ai du me planter quelque part, car mon code me donne rien
[console]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 PipedOutputStream cmd = new PipedOutputStream(); ByteArrayOutputStream sortie = new ByteArrayOutputStream(); channel.setInputStream(new PipedInputStream(cmd)); channel.setOutputStream(sortie); channel.connect(); System.out.println("connection effectuée"); cmd.write("more fichier.xml \n".getBytes()); System.out.println(sortie.size()); System.out.println(String.valueOf(sortie.toByteArray()));
connection effectuée
0
[B@1e45a5c
[/console]
pourtant, ca marche bien si je mets System.out à la place de sortie ???
Comment ce fait-il que la taille soit nulle ?
Voilà ce que dit la javadoc concernant les Pipped
Comme tu le vois ces streams sont généralement utilisés pour la communication entre Thread ce qui n'est pas le cas dans ton code. Or comme il est dit cela génère facilement des deadlocks, c'est peut-être ce qui se passe dans ton cas.Typically, data is read from a PipedInputStream object by one thread and data is written to the corresponding PipedOutputStream by some other thread. Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread
Ce que tu veux faire précisémment c'est envoyer une commande en texte? Pour cela comme je l'ai dit, tourne-toi plutôt sur les implémentations de Reader/Writer. Elles sont faites pour les données caractères.
Tu peux par exemple utiliser un BufferedReader pour lire et un BufferedWriter pour écrire... Sinon dis-nous en plus sur ton applic.
j'ai une application qui communique via le protocol ssh avec une machine distante.
au début, sans que je touche au code, ca ressemblait à ca :
je pouvais taper des lignes de commandes dans ma console, et j'avais leur résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 channel.setInputStream(System.in) channel.setOutputStream(System.out);
seulement, je voulais entrer mes lignes de commande par programmation, donc grace aux pipes (peut être pas la meilleure solution) je communiquais à l'application les commandes via
Et j'avais le résultat de mes commandes sur la sortie standard (System.out).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 PipedOutputStream cmd = new PipedOutputStream(); channel.setInputStream(new PipedInputStream(cmd)); cmd.write(....);
J'aimerais maintenant passé à l'étape suivante, c'est à dire récupérer le flux qui passait sur la sortie standard dans un flux que je puisse écouter, et traiter (récupérer les informations qui passent dedans )
EDITS :
je vais aller regarder les Reader/writer
bon, j'ai instancier un StringWriter, mais c'est incompatible avec ma méthode qui me demande un inputstream
apparemment, je pourrais récupérer un outputStream avec la méthode getOutputStream.
Si c'est vraiment l'output que je cherche, comment pourrais-je faire pour en exploiter les données ?
Heu... ce n'est pas très compliqué, mais cela reste ardu pour quelqu'un qui ne semble pas bien connaître ni les io, ni les threads.
À ce que je comprends tu veux envoyer les résultats de tes commandes ssh à la fois vers la console, et vers toi pour que tu puisses les retraiter ; d'où les piped. Mais c'est un peu compliqué, à cause des threads.
Pour éviter les threads, tu peux intercaler entre la sortie console et la sortie ssh une sortie à toi, qui reçoit ce qui vient du ssh, et le renvoie, dans le même thread, vers la console, après l'avoir traité. Cela revient à utiliser le principe général de la bibliothèque io, c'est à dire le décorateur.
Mais même plus simple comme ça il faudrait que tu te penches sur les mystères de java.io, de façon à pouvoir te créer ta propre classe de flux... Et une fois que c'est fait, tu pourrais écrire : channel.setOutputStream(monFluxDeSortie).
j'ai lutter toute la sainte journée (même si on est un jeudi)
et ca marche comme je veux.
Je voudrais vous remercier tous les deux, sans qui peu aurait été possible !
Je regarderais les I/O (enfin, quand j'aurais plus de temps car dans mon bouquin, il disent quasi rien. (énumération des classes, et un cop/col de la java doc )
encore !
Content que ca ait servi!
Tu peux juste nous montrer comment tu t'y es pris? Histoire que ca puisse aider d'autres que toi?
Tout de bon
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager