Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[OUTPUTSTREAM] créer et lire un outputstream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    [OUTPUTSTREAM] créer et lire un outputstream
    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 ?

  2. #2
    Membre éclairé
    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
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  3. #3
    Membre régulier
    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 ?

  4. #4
    Membre confirmé
    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 :
    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 ...

    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 !

    N'hésites pas à poser d'autres questions, on sait que les départs peuvent être durs.

  5. #5
    Membre régulier
    Merci à vous pour vos réponses,

    mais j'ai du me planter quelque part, car mon code me donne rien
    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()));

    [console]
    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 ?

  6. #6
    Membre éclairé
    Voilà ce que dit la javadoc concernant les Pipped

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

    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.
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  7. #7
    Membre régulier
    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 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    channel.setInputStream(System.in)
    channel.setOutputStream(System.out);

    je pouvais taper des lignes de commandes dans ma console, et j'avais leur résultat.

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

    Et j'avais le résultat de mes commandes sur la sortie standard (System.out).
    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

  8. #8
    Membre régulier
    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 ?

  9. #9
    Membre confirmé
    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).

  10. #10
    Membre régulier
    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 !

  11. #11
    Membre éclairé
    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
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

###raw>template_hook.ano_emploi###