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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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é.

+ 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