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

IO Java Discussion :

[OUTPUTSTREAM] créer et lire un outputstream


Sujet :

IO Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut [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é Avatar de Pollux
    Profil pro
    Inscrit en
    avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Suisse

    Informations forums :
    Inscription : avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    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
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    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é Avatar de spekal
    Inscrit en
    mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    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
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    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é Avatar de Pollux
    Profil pro
    Inscrit en
    avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Suisse

    Informations forums :
    Inscription : avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    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
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    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
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    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é Avatar de spekal
    Inscrit en
    mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    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
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2006
    Messages : 149
    Points : 73
    Points
    73
    Par défaut
    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é Avatar de Pollux
    Profil pro
    Inscrit en
    avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : Suisse

    Informations forums :
    Inscription : avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire un OutputStream
    Par litbos dans le forum IO
    Réponses: 5
    Dernier message: 14/09/2006, 11h16
  2. [Stream] OutputStream -> InputStream
    Par anykeyh dans le forum IO
    Réponses: 4
    Dernier message: 22/11/2005, 23h20
  3. [Image] image -> jpg -> OutputStream
    Par keil dans le forum IO
    Réponses: 18
    Dernier message: 09/11/2005, 15h36
  4. Réponses: 6
    Dernier message: 18/06/2005, 13h20
  5. Réponses: 4
    Dernier message: 29/04/2004, 12h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo