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 :

Partager des données avec un executable


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut Partager des données avec un executable
    Salut à tous,

    Je sais que le fait de commander un exécutable est un sujet qui revient souvent ici

    Mais moi j'aurais besoin de communiquer des informations entre l'exécutable et la partie Java (qui serait essentiellement l'interface graphique alors que l'exéc serait du code de calcul scientifique en C++).

    Je suppose qu'il n'existe pas de meilleur moyen que d'écrire un fichier sur le HD qui sera alors lu par le code Java. J'imagine qu'il n'est pas possible de lancer un thread qui partage de la mémoire avec un code exécutable, histoire d'éviter les lenteurs des IO sur le HD.

    Merci de confirmer/infirmer mes doutes !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Entre-temps, j'ai trouvé la doc

    http://ydisanto.developpez.com/tutor...e/runtime/#LIV

    qui explique qu'on peut communiquer avec des flux avec les exec.

    la méthode destroy() qui permet de tuer le processus de l'application externe,
    la méthode exitValue() qui permet de récupérer la valeur de retour du processus de l'application externe,
    la méthode getErrorStream() qui permet de récupérer le flux d'erreur du processus de l'application externe,
    la méthode getInputStream() qui permet de récupérer le flux de sortie du processus de l'application externe,
    la méthode getOutputStream() qui permet de récupérer le flux d'entrée du processus de l'application externe,
    la méthode waitFor() qui met le thread courant en attente que le processus de l'application externe se termine.
    Le problème, c'est que je ne vois pas bien comment Java saurait "quel" stream récupérer. Genre, dans mon code en C++, je pourais avoir plein de ostream en même temps, je ne vois pas bien comment Java ferait pour savoir lequel me renvoyer avec getOutputStream()

    Voilà voilà, dsl mais je débute en threads...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tu peux lire ceci

    "Le" iostream de ton processus C++, récupéré en java, c'est la sortie standard.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    c'est la sortie standard
    ... Tu veux dire cin >> et cout << ??

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    ... Tu veux dire cin >> et cout << ??
    Oui

    C'est ce qui est marqué dans la javadoc
    Citation Envoyé par javadoc Process
    The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (getOutputStream(), getInputStream(), getErrorStream()).

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 521
    Points
    521
    Par défaut
    Sinon, il y a aussi:
    - Corba: un peu lourd à implémenter, mais permet l'apple d'objet à distance, avec passage de paramètres
    - le JNI: pour appeler directement le code C++ en Java snas passer par programme.

    Si Corba est trop compliqué à mettre en place, tu peut simplement ouvrir une Socket entre le Java et le C++ et établir ton propre protocole de communication.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Ok, et j'imagine qu'on peut transmettre des données binaires ainsi ? Histoire d'éviter des erreurs d'arrondi pour transférer des données numériques...

  8. #8
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sinon tu as toujours la solution socket (et sérialisation pour les données binaires).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 521
    Points
    521
    Par défaut
    Oui, tu transmet tous les types de données primitifs, donc du double par exemple, ou du long, mais pas du unsigned long, qui n'existe pas en Java.
    avec Corba, tu peux aussi éventuellement transmettre tes propres types d'objets qui sont sérializés/ désérializés à parrtir de ces types de base, mais c'est peut-être mieux de se limiter aux types de bases et aux String dans un permier temps.
    En Socket, la réprésentation binaire des doubles ou des long doit-être la même entre C et Java.

  10. #10
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par deltree
    Oui, tu transmet tous les types de données primitifs, donc du double par exemple, ou du long, mais pas du unsigned long, qui n'existe pas en Java.
    avec Corba, tu peux aussi éventuellement transmettre tes propres types d'objets qui sont sérializés/ désérializés à parrtir de ces types de base, mais c'est peut-être mieux de se limiter aux types de bases et aux String dans un permier temps.
    En Socket, la réprésentation binaire des doubles ou des long doit-être la même entre C et Java.
    Attention, attention..

    Java assure que les donnees soient toujours envoyes de la meme facon quelle que soit la plateforme mais pas le C ou le C++.

    En C l'envoi d'un long sur une socket donnera un ordre des bytes differents suivant la plateforme (Station Sun et PC par exemple) une recherche sur le little et le big endian t'en apprendra plus : http://fr.wikipedia.org/wiki/Endianness

    Voila pour la precision,

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 72
    Points
    72
    Par défaut
    Java assure que les donnees soient toujours envoyes de la meme facon quelle que soit la plateforme mais pas le C ou le C++.
    Donc si je veux une portabilité maximale, je fais mieux d'utiliser le cin et cout standard, et n'envoyer que des double, int, bool et string.

    Pour moi ça va déja comme ça

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/04/2015, 15h32
  2. VmWare sous XP: partager des données avec Linux
    Par EvilAngel dans le forum VMware
    Réponses: 18
    Dernier message: 06/01/2009, 13h03
  3. [format des données avec une procédure stockée]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 10/03/2005, 13h24
  4. Exporter seulement une partie des données avec pg_dump ?
    Par Philhz dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/07/2004, 09h50
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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