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

Entrée/Sortie Java Discussion :

ObjectInputStream et System.in


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut ObjectInputStream et System.in
    Bonjour tout le monde.

    Je travaille sur deux trois classes destinés à faire communiquer deux processus de mon API via des objects.

    Le fonctionnement se veut le plus simple possible : une classe du process A crée le process B. Ce faisant, A se garde sous le coude un object input stream et un object output stream correspondant à B, et les deux communiquent à l'aide d'object serializés prévus à cet effet.

    Histoire de rester propre j'ai donc prévu les dites deux trois classes dédié à la comm'. Et je bloque bêtement au début :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public StreamChannel(InputStream stdInput, OutputStream 
    		try {					
    			objectOutput = new ObjectOutputStream(stdOutput);
    			objectInput = new ObjectInputStream(stdInput);	
    		} catch (IOException e) {
    			getLog().getLogger().severe(
    			    "Unable to create object stream ! " + e.getMessage());
    		}
    	}
    Pour tester j'appelle ce constructeur avec System.in, System.out et System.err. Le ObjectOutputStream passe, puis ça freeze sur le ObjectInputStream(stdInput). Pas de message d'erreur, pas de plantage, juste bloque - plus rien.
    Ce n'est pas l'usage normal prévu qui lui s'apparente plutôt à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    process = rt.exec("D:\\...\\start.bat");	
    InputStream is = process.getInputStream();
    StreamChannel st = new StreamChannel(is,...)
    Mais j'aimerai bien savoir quel est le problème quand même, si quelqu'un sait ?

  2. #2
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    En fait se que tu essaies de faire c'est un pipe c'est ca ?

    Tu veux que se que retourne process soit mis dans le Input c'est ca ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Il me semble oui, mais je ne connais pas spécialement le mécanisme des pipes donc je ne l'ai pas mentionné.

  4. #4
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Alors la solution serait d'utiliser PipedOutputStream je pense

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Okay, du coup je pensais avoir trouvé mon bonheur avec cet exemple :

    http://prevert.upmf-grenoble.fr/Prog...putStream.html

    Mais en fin de compte, j'ai quand même besoin d'ObjectInputStream et ObjectOutputStream pour faire du transfert d'objet. Et du coup j'ai toujours un freeze à la création

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public PipeChannel(PipedInputStream input, PipedOutputStream output) {
    
    		this.input = input;
    		this.output = output;
    		
    		try {								
    			objectOutput = new ObjectOutputStream(output);	
    			objectInput = new ObjectInputStream(input); // Freeze sur cette ligne		
    		} catch (IOException e) {
    			getLog().getLogger().severe(
    			    "Unable to create object stream ! " + e.getMessage());
    		}
    
    	}

  6. #6
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Et si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectInputStream objectInput = new ObjectInputStream(PipedInputStream(objectOutput));

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    new ObjectInputStream() lit les header dans le stream. Tant que l'application lancée n'a pas écrit ses header, cette ligne ne retournera pas:

    Citation Envoyé par Code de SUN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ObjectInputStream(InputStream in) throws IOException {
    	verifySubclass();
    	bin = new BlockDataInputStream(in);
    	handles = new HandleTable(10);
    	vlist = new ValidationList();
    	enableOverride = false;
    	readStreamHeader();
    	bin.setBlockDataMode(true);
        }
    Ce header doit etre écrit par l'autre applicaiton dans le cadre de new ObjectOutputStream(stream).

    Note que la particularité des stdout et stdin, c'est qu'ils ne sont pas flushé automatiquement par l'os. Faut donc penser à faire un out.flush() après chaque opération pour être sur que l'autre process recoive ce que t'as envoyé.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Citation Envoyé par X-plode Voir le message
    Et si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectInputStream objectInput = new ObjectInputStream(PipedInputStream(objectOutput));
    Eclipse a pas compris le PipedInputStream(objectOutput), et moi non plus en fin de compte

    Ce header doit etre écrit par l'autre applicaiton dans le cadre de new ObjectOutputStream(stream).
    Ah ... et je fais ça comment ?
    J'ai tenté un write + flush sur le Piped histoire de voir s'il allait faire le boulot à ma place, mais en fait non. Et j ai pas trouvé grand chose qui parle d'initialisation de Header sur google

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    quand tu fait new

    ObjectOutputStream(stream) la classe ObjectOutputStream écrit quelques bytes sur stream. Quand tu fais ObjectInputStream(stream), ObjectInputStream() lit ces même bytes. Dans ton cas tu bloque sur le input, parce que, de l'autre coté du tube, on n'a encore rien envoyé! Il attends donc sagement ses données.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Gné, compliqué tout ça... Je vais attendre d'avoir un peux avancé le mécanisme de mes deux process pour me repencher sur la comm' du coup, parce que la les tests c'est pas pratique tu tout.

    N'empêche que je ne vois pas comment on peut utiliser les PipedxxxStream entre deux process. Il faut créer le in et le out ensemble, donc implicitement dans un même process, et envoyer l'un des deux à l'autre process ... ?
    A moins qu'un constructeur Piped puisse se baser sur le getxxxStreamdu Process ertourné par le Runtime.exec, ça me semble mort.

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    oublie les pipe, utilise sytem.in et system.out directement. Et quand tu crée tes objectOutputStream, crée les comem çà, pour éviter tout problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    outputObject = new ObjectOutputStream(System.out);
    System.out.flush();//s'assure que l'autre processus recois ce qui a déjà été écrit sur System.out

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Je le sentais bien comme ça aussi !

    Merci chef

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    A mon grand dam, je me vois obligé de relancer le sujet parce qu'en fin de compte, non ça marche po

    J'ai donc mon application qui fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Process process = runtime.exec(cmd + file);
    			FlowStreamChannel flowChannel = new FlowStreamChannel(process.getInputStream(), process
    			    .getOutputStream());
    Le constructeur de FlowStreamChannel fait simplement un super(in,out) qui atterit ici

    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
    public StreamChannel(InputStream in, OutputStream out) {		
    		try {
    			output = new BufferedWriter(new OutputStreamWriter(out));
    			output.flush();
    			
    			input = new BufferedReader(new InputStreamReader(in));						
    
    			
    			objectOutput = new ObjectOutputStream(out);			
    			objectOutput.flush();
    						
    			objectInput = new ObjectInputStream(in);
    
    			getLog().getLogger().fine("StreamChannel connected");
    
    		} catch (IOException e) {
    			getLog().getLogger().severe("Unable to create objectStream ! " + e.getMessage());
    		}
    
    	}
    Et freeze sur la ligne en gras. Que suis je censé faire, envoyer un objet depuis mon process histoire de mettre en route l'objectInput ?

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    non t'es censé créer et flusher l' objectoutputstream de l'autre coté (c'est à dire dans l'autre applicaiton) tant que ce ne sera pas faire, le constructeur de ObjecTInputStream ne retournera pas car, comem déjà dit, il attends les premiers byte marquant le début de la sérialisation.

    De plus, tu ne pexu pas mélanger des stream de sérialization et des buffered reader /writer sur le même flux. Donc va falloir soit virer ces bufferedReader /writer, soit ces objectinput/ouputStream. Ou alors va falloir t'amuser à créer ton propre protocole de mulitplexage pour avoir plusieurs flux entrelacés sur un seul flux.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    196
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 196
    Par défaut
    Ca passe. Bon, tout le reste à l'air de faire n'importe quoi, mais ça passe

    Encore merci.

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

Discussions similaires

  1. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  2. [Kylix] libc.system
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 19/10/2002, 13h48
  3. [VB6] [Système] Barre des taches
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 15h16
  4. [VB6] [Système] Icones du systray qui veulent pas partir
    Par Ctof dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/10/2002, 09h41
  5. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

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