IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage Java Discussion :

Pipes en Java


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut Pipes en Java
    Salut

    Ça va faire plusieurs jours déjà que je m'acharne à vouloir faire marcher un pipe en Java. Mon erreur est peut être hyper simple, mais je ne veux pas de réponses du genre : "cherche sur google". Je suis loin d'être un débutant en Java, pourtant là, quelque chose m'échappe. Voila mon code (je vous passe les imports):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class tst {
     
    	public static void main(String[] args) {
     
    		PipedInputStream pis = new PipedInputStream();
    		PipedOutputStream pos = null;
    		try {
    			pos = new PipedOutputStream(pis);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		OutputStreamWriter ow = new OutputStreamWriter(pos);
    		String s = "";
     
    		th T = new th(pis);
    		T.start();
     
    		try {
    			while(true) {
    				s = br.readLine();
    				System.out.println(s);
    				ow.write(s);
    			}
    		} catch (IOException e) {e.printStackTrace();}
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class th extends Thread {
     
    	private PipedInputStream pis;
     
    	public th(PipedInputStream is) {
    		this.pis = is;
    	}
     
    	public void run() {
     
    		BufferedReader br = new BufferedReader(new InputStreamReader(this.pis));
     
    		while(true)
    			try {
    				System.out.println(br.readLine());
    			} catch (IOException e) {e.printStackTrace();}
    	}
    }
    Le résultat attendu étant bien sur que le programme m'affiche deux fois ce que je saisi au clavier.

    Voila voila
    Et merci d'avance

  2. #2
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    Quelle est l'erreur que produit ton programme ou le résultat de son exécution?

  3. #3
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Je n'ai justement pas de résultat de la part du thread.
    J'entre quelque chose au clavier, donc le System.out.println() juste derrière m'affiche ce qu j'ai rentré (c'est juste histoire de débugger), mais à l'autre bout du pipe le thread n'affiche rien et donc n'arrive pas à lire dans le pipe :s

    Mis à part ça, je n'ai aucune exception. Il semblerai que le thread soit encore en attente.

  4. #4
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour orava

    quand tu fait un tst en ligne 25
    remplace le par

    Page sur Developpez : http://pbriand.developpez.com

  5. #5
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Ok j'essayerai et je vous tiens au courant. Mais sinon, pourquoi est-ce qu'un simple saut de ligne change les choses ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 68
    Par défaut
    @"Je suis loin d'être un débutant en Java"
    A cause du readLine()

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut
    Un petit coup de flush() sur ton buffer en sortie peut-être ??

  8. #8
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Un petit coup de flush() sur ton buffer en sortie peut-être ??
    J'y avais pensé, mais cela ne suffit pas
    Page sur Developpez : http://pbriand.developpez.com

  9. #9
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Citation Envoyé par bpy1401 Voir le message
    Bonjour orava

    quand tu fait un tst en ligne 25
    remplace le par

    Non désolé ça ne marche pas mieux :s

  10. #10
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    Une solution à ton problème serait d'écrire directement dans ton PipedOutputStream.

    De plus la création du PipedInputStream peut se faire directement dans lors de la création du Thread avec une connexion au PipedOutputStream créé.
    Ce qui donnerait le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public class tst {
     
    	public static void main(String[] args) {
     
    		PipedOutputStream pos = null;
    		try {
    			pos = new PipedOutputStream();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		String s = "";
     
    		th T = new th(new PipedInputStream(pos));
    		T.start();
     
    		try {
    			while(true) {
    				s = br.readLine();
                                    s += "\n"
     				System.out.println(s);
    			        pos.write(s.getBytes());
    			}
    		} catch (IOException e) {e.printStackTrace();}
     
    	}
     
    }
    Il ne reste plus qu'a gérer la nullité du pos et le charset.

  11. #11
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    En reprenant ton code d'origine, avec deux lignes en plus ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ow.write(s);
    ow.write('\n');
    ow.flush();

  12. #12
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Yeeees merci gma ^^
    C'est quoi en fait flush() ?

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 586
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Voici la JavaDoc de Writer.flush(). Elle est carrément semblable à OutputStream.flush(), et de manière générale respecte Flushable.flush().

    La JavaDoc est assez claire. flush() indique que si, par le plus grand des hasard, le Writer a gardé des caractères dans un buffer et ne cherche pas encore à les écrire/transmettre, alors il doit vider maintenant son buffer en les écrivant/transmettant.

    Un BufferedWriter, par exemple, fait cela exprès justement pour transmettre les caractères par grandes quantités, plutôt que de faire des transmissions coûteuses, un caractère à la fois. Mais si, à un moment, on veut vraiment que ce qu'on vient d'écrire soit transmis tout de suite, flush() lui ordonne de le faire.

    Un PipedOutputStream fonctionne pareil : pour que ça marche, il y a un buffer partagé entre le PipedOutputStream et le PipedInputStream. Comme l'indique la JavaDoc de PipedOutputStream.flush(), l'InputStream n'essaie pas de consommer tout de suite dès qu'on lui insère dans le buffer. Ce ne serait pas efficace. Il attend que le buffer soit plein, ou bien que le PipedOutputStream soit fermé, pour tout lire d'un coup. Un flush() du côté du OutputStream lui ordonne de lire le buffer immédiatement.
    Sur le principe c'est une bonne idée, mais dans ton cas d'utilisation c'est perturbant, parce qu'il faut remplir le buffer avant de voir les effets du pipe. Et il fait quand même 1ko.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Ok ok
    Et bien merci pour cette explication ^^

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

Discussions similaires

  1. Yahoo! Pipes création flux avec un site en java
    Par Alexis05 dans le forum Webmarketing
    Réponses: 0
    Dernier message: 28/04/2013, 17h33
  2. Jahia et java broken pipe ?
    Par hpl76 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 15/04/2011, 13h13
  3. java.net.SocketException: Broken pipe
    Par biozaxx dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 20/03/2009, 16h45
  4. [JDBC] Erreur java.sql.SQLException: Io exception: Broken pipe pool tomcat
    Par lbd_9C dans le forum Interfaces de programmation
    Réponses: 0
    Dernier message: 29/05/2008, 19h00
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 13h48

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