COMMENT LANCER UNE COMMANDE SYSTEME A PARTIR D'UN SIMPLE CODE JAVA
nobble
Messages postés2Date d'inscriptionjeudi 9 juin 2005StatutMembreDernière intervention 9 juin 2005
-
9 juin 2005 à 15:50
lubert56
Messages postés1Date d'inscriptionjeudi 11 avril 2013StatutMembreDernière intervention18 avril 2013
-
18 avril 2013 à 16:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
En plus des explications courantes du problèmes, il y a une petite API qui simplifie le code pour arriver aux résultats attendus.
Bonne chance pour vos codes.
vaytess
Messages postés14Date d'inscriptionsamedi 18 octobre 2008StatutMembreDernière intervention16 juillet 2009 4 août 2009 à 11:55
salut tout le mode..j'utilise windows vista et ce code exécute les .exe mais les .bat non plus..qlq1 possède une solution..c'est urgent :))
cs_Timor
Messages postés11Date d'inscriptionlundi 22 août 2005StatutMembreDernière intervention29 juin 2008 16 juin 2008 à 13:59
Bonjour
je sais que ca n a rien a voir avec ta source, mais je veux seulement savoir comment interagir avec une autre application (on executant ses methodes par exemple ... etc), PAR EXEMPLE comment a partir d un code JAVA on peut se deconnecter de msn ou comment on peut lancer la methode sendMessage() de msn a partir de notre source.
Merci d'avance
cs_freder10
Messages postés1Date d'inscriptiondimanche 25 février 2007StatutMembreDernière intervention12 février 2008 12 févr. 2008 à 00:08
merci
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 18 janv. 2008 à 16:04
pas forcement sure non plus ni tres utile ....
TheSpartacus
Messages postés4Date d'inscriptiondimanche 24 décembre 2006StatutMembreDernière intervention17 janvier 2012 18 janv. 2008 à 09:22
Un programme trés utile pour bcp d'application .
cs_sana2007
Messages postés1Date d'inscriptionmercredi 17 octobre 2007StatutMembreDernière intervention26 octobre 2007 26 oct. 2007 à 10:10
pour le code je le essayé pour exécuter une commande pour exporter des tables de une base de données oracle mais ca ne marche pas. c'est fais à partir d'une application web ou la varibla cmd est envoyé à partir d'une page jsp
Non il aurait juste fallu que vous alliez sur le site de Sun où il y a déjà ce genre d'exemples, ça fait doublon. Je n'ai jamais prétendu être un génie de l'informatique. D'autres utilisateurs n'ont pas voulu gâcher leur énergie à le dire, moi je le fais. Je trouve ça nul de faire à peu de choses près du copier-coller d'autres tutoriaux. Tu n'es pas le premier que je repère. J'en ai déjà dénoncé un autre, il me semble même que son bout de code a été supprimé dans la journée. Je te remercie de t'être défoulé en mettant une note de "1/10" à mon jeu. Moi je travaille dessus depuis presque un an et presque 6000 personnes sont déjà passées sur le forum de ce projet.
dkieffer
Messages postés6Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 4 août 2009 14 sept. 2007 à 15:21
Bon, je pense qu'un récapitulatif s'impose...
Pour lancer une commande Système, la base c'est
Process p = Runtime.getRuntime().exec(String maCommande);
et si on veut attendre la fin de l'execution:
p.waitFor();
Problème, on ne voit pas le résultat. Pire! Si la commande est sensée écrire beaucoup dans la console durant son exécution ou lorsqu'elle rencontre une erreur, cela peut bloquer le programme java!
Ceci pour la simple raison que Java récupère les flux d'entrées et de sortie du Process, et que si les flux sont remplis, il faut les vider sous peine de mettre Java indéfiniment en attente.
On récupère les flux de sortie grâce aux méthodes de Process:
getInputStream() et getErrorStream() .
Il faut ensuite les lire comme n'importe quel flux. Ceci est aussi la méthode pour récupérer le résultat d'une commande Système comme décrite plus haut.
Parce que Java récupère les flux d'entrée et sortie, les "pipes" et "redirections" ne fonctionne pas directement!
Il faut créer un Thread qui va lire le Process.getInputStream du premier Process et récrire le résultat dans le Process.getOutputStream() du second pour un pipe, ou un fichier pour une redirection.
Dernier Gros problème.. C'est que Java ne récupère pas les sortie fils.. Donc si on appelle un programme Système qui va lancer un second programme Système qui lui affichera le résultat... On n'a pas la sortie de se second Programme...
Seul alternative concluante je pense pour l'instant: générer un script à la volée qui lance le Programme avec une redirection dans un fichier (avec '> mon_fichier'), puis lancer le script avec Runtime, puis lire le fichier de sortie.. Solution lourde et plateforme spécifique mais ça marche...
Donc, non! Il ne suffit pas de lire l'API de sun pour maîtriser ce problème (d'où nos efforts).. Si maintenant, dans les nouvelles versions de Java, il y a de meilleur façon de faire.. Tout le monde sera heureux de le savoir...
cs_larsson
Messages postés41Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention 8 juin 2007 14 sept. 2007 à 14:56
merci pour ton commentaire constructif. Merci aussi d'être aussi direct. Mais si mon code te derrange tant pourquoi avoir pris la peine de poster ici un message: c'est de l'enrgie inutile! sachant que les statistique et les messages montre tout a fait le contraire que plusieurs utilsateurs approuvent!!! . En plus c'est destiné au gens qui ne sont pas des as de la programmation. Pas aux genies comme toi.
ciao :)
Je ne vois pas l'intérêt de ton code source, il n'y a que 5 lignes de code. Il suffit de lire la documentation de l'API de Java pour écrire cela. De plus, je ne vois pas l'intérêt de pomper directement du code source sur le site de Sun pour le mettre ici. Ton code n'ajoute rien de plus à ce que l'on peut déjà trouver sur le net.
dkieffer
Messages postés6Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 4 août 2009 17 août 2007 à 15:01
Errata: pour le code de Commande.
//je crée ma commande
Commande com=new Commande(StringMaCommande);
java.io.File sortie=new java.io.File("monChemin/resultat.txt");//mon fichier de sortie
try {
FileOutputStream out=new FileOutputStream(sortie);
com.redirectSimple(out);//ici je configure la sortie de la commande
com.exec();//ici je lance le bazar
com.waitFor(); //ici j'attend que la commande soit bien execute
out.close(); //et seulement après je ferme le fichier....
} catch (IOException ex) {
ex.printStackTrace();
}
dkieffer
Messages postés6Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 4 août 2009 9 août 2007 à 12:08
pour Killer un process p, il suffit d'utiliser la commande p.destroy();
cutemeister
Messages postés1Date d'inscriptionmardi 30 janvier 2007StatutMembreDernière intervention 9 août 2007 9 août 2007 à 11:57
merci pour le code
pour le flux de sortie essaye de faire une redirection comme sous unix (c'est le meme principe')avec '>' a la fin de la commande a executer dens un fichier et puis le lire. et g une question malgré que cela peut etre un peu luin de notre sujet mé esseque quelcun pourais me donner la commande a executer pour arreter un prossesus??
merci d'avance
dkieffer
Messages postés6Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 4 août 2009 3 août 2007 à 14:07
foufoulina2007,
il est vrai que en Java, la gestion des commandes systèmes n'est pas géniale.. C'est pourquoi j'avais fait à l'époque une API pour m'en sortir. Elle permet de lancer simultanément des commandes systèmes et de savoir quand elles sont terminées pour les coordonner.
Mais bon, tout cela pour dire que à la demande de plusieurs personnes, pour gérer les redirections, et les "pipes", j'ai fait une nouvelle version. l'API s'appelle ProgRunner et la classe dont tu auras besoin pour lancer une commande système s'appelle..... "Commande".
On l'utilise ainsi:
//je crée ma commande
Commande com=new Commande(StringMaCommande);
java.io.File sortie=new java.io.File("monChemin/resultat.txt");//mon fichier de sortie
try {
FileOutputStream out=new FileOutputStream(sortie);
com.redirectSimple(out);//ici je configure la sortie de la commande
com.exec();//ici je lance le bazar
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
cotoxin
Messages postés1Date d'inscriptiondimanche 11 février 2007StatutMembreDernière intervention31 juillet 2007 31 juil. 2007 à 14:52
Salut foufoulina2007.
Quand tu fait process.getErrorStream() et process.getInputStream(), tu récupère les sorties standards et d'erreur du process.
Tu peut ensuite les mettres dans un fichier en faisant un truc du genre :
cmd= "generate -package c://test//grammarFolder -grammar .Tgram"
Process process = Runtime.getRuntime.exec(cmd);
InputStream standardOut = process.getInputStream();
process.waitFor();
File temp = new File("fileTemp") ;
puis ensuite tu rempli le fichier avec l'InputStream que tu à récupéré en fesant process.getInputStream. Je me rappelle plus comment on rempli un fichier avec une InputStream mais tu doit trouver facilement sur google.
Par contre moi j'ai une autre question :
Comment faire un Runtime.exec() avec les droits administrateur ??
foufoulina2007
Messages postés1Date d'inscriptionmardi 24 juillet 2007StatutMembreDernière intervention24 juillet 2007 24 juil. 2007 à 15:45
moi j'ai un pb de ce contexte, j'ai pu lancer commande avec java avec le code suivant:
String cmd= "nuance-compile c://test//grammar English.America -auto_pron -o c://test//grammarFolder";
Runtime runtime1 = Runtime.getRuntime();
try {
Process process = runtime1.exec(cmd);
//mettre fin au processus
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
}
catch (Exception e) {
}
mon pb que j'ai besion de lancer une autre commande mais j'ai besion de rédiger la sortie de la commande dans un fichier
donc la commande est comme suit:
cmd= "generate -package c://test//grammarFolder -grammar .Tgram > fileTemp"
mais la redérection " > "ne marche pas alors je fait koi??
please aide moi
cs_larsson
Messages postés41Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention 8 juin 2007 9 mai 2007 à 15:07
Salut Mazizou,
est ce que t'as essayé
cmd="cmd /c c:\\fichier.bat" !!
PUIS
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
sinon poste le bout de code ou envoi le par mail pour voir ce qui se passe!!
ciao
cs_mazizou
Messages postés1Date d'inscriptionmercredi 20 septembre 2006StatutMembreDernière intervention 9 mai 2007 9 mai 2007 à 14:05
Bonjour a tous.
Tout d'abord merci pour ton code Larsson.
J'ai un petit probleme, en effet mon but est d'ouvrir un fichier .bat sous windows XP.
J'ai donc recuperer le code tel quel et j'ai choisit la partie :
//Win NT(XP...) : pour lancer un .bat
Mais ca ne marche pas.
J'ai vu egalement que Larsson a mis que le code ne marchait pas du premier coup, qu'il fallait initialiser 'cmd'.
Ma question est il faut initialiser la variable String cmd ?
Dans mon cas c'est ce que j'ai fait mais ca ne marche toujours pas . Il n'y peut etre quelque chose que je n'ai pas bien saisi.
Donc si quelqu'un peut m'aider ce serait tres sympa car ce code correspond exactement avec ce je veux faire.
Merci d'avance.
Cordialement.
kanzs
Messages postés4Date d'inscriptionmardi 12 décembre 2006StatutMembreDernière intervention 3 mai 2007 4 mai 2007 à 17:08
Monsieur, moi j'ai un probleme qui me fatigue depuis deux semaine ,je dois equiper une tablet PC(Itronix Duo-Touch Equiper de Microsoft windows XP Edition Tablet PC 2005 version 2002, service Pack 2 d'une interface capable de prendre en compte les fonctionnalites suivantes:
Le système doit permettre d'échanger (recevoir/modifier/renvoyer (des documents renseignes) des schémas techniques) tout type de fichiers entre les chefs de chantier depuis leur lieu de travail (chantier) vers les deux sites de la base arrière (: Protec-feu et TPI).
Le système doit permettre aux chefs de chantier d'effectuer des requêtes sur le serveur de la base Documentaire de PF/TPI.
Le système doit permettre de récupérer des informations de déréférencement (position et timbre temporel).
Le système doit rendre obligatoire la validation des différents champs du document avant sauvegarde
Le système doit permettre la validation par les achats des bons de commande émis par les itinérants ainsi que la vérification de la conformité des commandes émis par celui ci.
Le système doit permettre la vérification de la bonne exécution des commandes (commanditaires/fournisseurs/transporteurs/réception)
Le système doit archiver toutes les informations envoyées par les chefs de chantier sur un serveur de backup qui servira de zone de stockage et permettra la sécurisation des données.
Le système doit permettre de retrouver toutes les informations contenues sur une tablette PC en cas de perte/vol/destruction/panne de celui-ci.
sur le Systeme se trouve les applications suivantes:
Adobe Reader 7.0,windows media connect,Assistance a distance,Journal windows,windows Movie Maker,ITV BlueSoleil,Outlook Express,MicrosoftMapPointEurope2004,Realtek Sound Manager,Internet Explorer, MSN,Windows Mdia Player.
Comment interfacer ces differentes application pour excuter les differentes fonctionnalites du Systeme à realiser en se servant du language java,et quelles sont les nouvelles applications qui manquent.
Je vous remercie de toute l'attention que vous voudrez bien accorder a ma presente preoccupation.
adilook
Messages postés4Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention14 décembre 2006 14 déc. 2006 à 15:22
je ne sais pourkoi non pour javac
adilook
Messages postés4Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention14 décembre 2006 13 déc. 2006 à 16:36
avec la commande "Java", il tourne , indiquant le flux de sortie avec :
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
BufferedReader r1 = new BufferedReader(
new InputStreamReader(p.getInputStream())
);
String x;
while ((x = r1.readLine()) != null) {
System.out.println(x);
}
r1.close();
p.waitFor();
si vous avez un exemple avec la classe compile, merci de le diffuser
adilook
Messages postés4Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention14 décembre 2006 13 déc. 2006 à 16:24
cs_larsson
Messages postés41Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention 8 juin 2007 13 déc. 2006 à 15:57
Salut,
Je ne vois pas pkoi ça marche pas.
bref, le plus important c'est pas comment l'executer cette classe (car ne fait aucun veritable boulot) mais comment on peut l'exploiter dans de vrai programme.
Merci pour votre remarque, j'essayerais de ma part.
ciao
adilook
Messages postés4Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention14 décembre 2006 13 déc. 2006 à 15:51
c'est trés interessant , mé avec une commend Javac , c marche pas
NB : j'utilise Netbeans, je veux faire une fonction compile(fname) qui permet de compiler un fichier java
jmecodol
Messages postés16Date d'inscriptionjeudi 19 janvier 2006StatutMembreDernière intervention28 août 2006 20 août 2006 à 15:30
je voudrai pas soulever un vieux problème,
mais voila,
je suis tombé "par hasard" sur ce site :
http://javaalmanac.com en consultant java.com ; )
et apperement on peut récupérer facilement la sortie
du processus créé en 4 lignes .
attention :
// Get the input stream and read from it
InputStream in = child.getInputStream();
int c;
while ((c = in.read()) != -1) {
process((char)c);
}
in.close();
} catch (IOException e) {
}
après j'ai pas eclipse sur moi la tout de suite,
pour voir la classe de process(char) .
(\__/)
(+'o'+)
(")v(") pourvu que ca marche
(inspiré de nainwak)
liquideshark
Messages postés32Date d'inscriptionmercredi 2 août 2006StatutMembreDernière intervention29 mai 2007 18 août 2006 à 11:38
Il est super ton code larson. bonne javanaise
sheorogath
Messages postés2448Date d'inscriptionsamedi 21 février 2004StatutModérateurDernière intervention29 janvier 201017 30 juin 2006 à 12:21
pour recupere le flux de sorti je vous renvoi vers une de mes source => execution de commande dos a distance
quimarche pour tout OS normalment
jmecodol
Messages postés16Date d'inscriptionjeudi 19 janvier 2006StatutMembreDernière intervention28 août 2006 2 juin 2006 à 13:38
grand merci - merci -merci dkieffer ;
j'ai un projet en java/C avec tout un tas d'interactions
entre interface-java et C .
a la base c'est un projet avec des pipes,...
grace a tes sources, je gagne un max de temp pour ces interactions,
merci larsson pour avoir lancé le sujet !
bravo !!
dkieffer
Messages postés6Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 4 août 2009 20 avril 2006 à 09:56
J'ai dû me casser les dents aussi sur ce point. Le seul moyen que j'ai trouvé pour récupérer la sortie en direct c'est de faire un "Thread" qui lit le flux de sortie du programme lancé en continue, et me l'imprime dans le System.out ou vers un conteneur de texte de mon choix.
Pour mon projet j'ai fait une classe qui gère les appels de commande externe. J'ai mis le code source de cette classe ainsi que celui d'un exemple d'utilisation sur :
http://www-bio3d-igbmc.u-strasbg.fr/~dkieffer/sourceJava/ProgRunner.htm et http://www-bio3d-igbmc.u-strasbg.fr/~dkieffer/sourceJava/TestProgRunner.htm
J'espère que celà vous sera utile.
cs_AbriBus
Messages postés492Date d'inscriptionjeudi 28 août 2003StatutMembreDernière intervention25 avril 20075 10 déc. 2005 à 07:54
... je crois bien me souvenir que tu peux instancier un flux sur un fichier... le stdout en est un flux aussi... donc tu instancie ton fichier avec un fileoutputstream et tu redirige le stdout vers le fileoutputstream. Sincerement je ne l'ai jamais fait (sinon je t'aurais donne la source) mais je ne vois rien qui empeche de le faire.
Bon courage... bonne prog
'BriBus
chour03
Messages postés25Date d'inscriptionsamedi 31 mai 2003StatutMembreDernière intervention31 décembre 2008 10 déc. 2005 à 01:36
mhhhh ok ... merci bien pour votre aide.
en fait je cherchais une class java qui le gérait, les redirections système je les connais, mais par contre j'ai pas trouvé de méthode à partir de Runtime ou de Process qui permettait de stocker la sortie standard (stdout si vous preferez) dans une var . Par exemple, style :
String date = new String("");
date = Runtime.getRuntime().exec("time").CapturerSortie();
Enfin l'histoire de la redirection est pas bete vi... suffit d'ouvrir le fichier avc java après après tout... Mais ça fait un peu "bidouillage", pardonnez-moi l'expression.
Merci quand meme, parce que ça ne m'était pas vraiment venu à l'esprit :)
Si k1k1 a une solution quand meme, pour faire ça de façon directe, chuis preneur :-)
cs_larsson
Messages postés41Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention 8 juin 2007 9 déc. 2005 à 11:54
salut a tous,
bon en ce qui concerne la cas de redirection de la sortie standard dans un fichier la solution est donnée par AbriBus.
en ce qui concerne une variable(unix):
2 cas se presentent:
une variable systeme
une var java de ton code
1-- Var systeme ;tu execute les commandes suivantes:
export VAR
VAR=`ps`
echo $VAR
ces trois etapes font une creation de var "VAR", ensuite on enregistre le resultat de la cmde "ps" dans cette var (mais on perd le formatatge de donnée essais pour voir qu'est ce que ça donne)
2-- une var java: je n'est pas vraiment une solution qui marche , mais pense un peut a traiter les information qui sont contenu dans un fichier de redirection comme le message precedent le décrit avec l'aide de l'api java.util.regex.* c'est une api disons "exprexssion regulière comme dans perl" et pour plus d'information vas dans: http://java.sun.com/j2se/1.5.0/docs/api/ cordialement Larsson
A+
cs_AbriBus
Messages postés492Date d'inscriptionjeudi 28 août 2003StatutMembreDernière intervention25 avril 20075 9 déc. 2005 à 10:04
avec le command classique de winnt ou 2000 ou XP il faut ecrire la commande de la sorte:
C:\>[nomDeLaCommande] [parametresDeLaCommande] > [fichierDeDestination]
ca c'est pour creer/ecraser le fichier qui contiendra ce que t'aurait affiché la fenetre (TEXT ONLY !!)
sinon, tu peux egalement décider de concatener ce que t'affichera la sortie de l'execution de ta commande a un fichier deja existant (sans ecraser donc le resultat precedant mais en le mettant a la suite) auquel cas tu utilisera la ligne de commande suivante:
C:\>[nomDeLaCommande] [parametresDeLaCommande] >> [fichierDeDestination]
Voila... pour les autre OS desolé je connais pas.
j'espere que c'etait bien le sens de ta question et que ca pourra t'etre utile.
Bon courrage
AbriBus
chour03
Messages postés25Date d'inscriptionsamedi 31 mai 2003StatutMembreDernière intervention31 décembre 2008 9 déc. 2005 à 09:56
Sympa ton bout de code !
Par contre saurais-tu s'iol estpossible de rediriger la sortie standard vers une variable ?
Je m'explique : Si tu lances la commande ps sous unix (ou tasklist sous windows), tu fais comment pour récupérer le résultat ?
Merci !
cs_AbriBus
Messages postés492Date d'inscriptionjeudi 28 août 2003StatutMembreDernière intervention25 avril 20075 30 juin 2005 à 09:41
ca c'est cooooooooooooooooooooollll !!
Merci
cs_larsson
Messages postés41Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention 8 juin 2007 9 juin 2005 à 15:57
tu as tout a fait raison, j'ai oublier de differencier le cas 95/98 avec NT/(bien sur toute la famille NT).
désolé ;)
nobble
Messages postés2Date d'inscriptionjeudi 9 juin 2005StatutMembreDernière intervention 9 juin 2005 9 juin 2005 à 15:50
Cette application fonctionne bien mais après utilisation avec Windows XP pour lancer un .exe, je recommande dans ce cas d'utiliser "cmd" et non "command.com" comme ce qui est affiché dans l'article. "command.com" transmet le chemin passé en majuscule, ce qui m'a posé quelques problèmes alors que "cmd" ne modifie pas les majuscules et les minuscules.
18 avril 2013 à 16:31
12 mai 2011 à 13:09
est ce que vous pouvez me dire pourquoi
merci d'avance
4 août 2009 à 16:43
En plus des explications courantes du problèmes, il y a une petite API qui simplifie le code pour arriver aux résultats attendus.
Bonne chance pour vos codes.
4 août 2009 à 11:55
16 juin 2008 à 13:59
je sais que ca n a rien a voir avec ta source, mais je veux seulement savoir comment interagir avec une autre application (on executant ses methodes par exemple ... etc), PAR EXEMPLE comment a partir d un code JAVA on peut se deconnecter de msn ou comment on peut lancer la methode sendMessage() de msn a partir de notre source.
Merci d'avance
12 févr. 2008 à 00:08
18 janv. 2008 à 16:04
18 janv. 2008 à 09:22
26 oct. 2007 à 10:10
Merci d'avance pour votre aide
17 sept. 2007 à 12:51
http://www.exampledepot.com/egs/java.lang/Exec.html
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
Là, il y a des examples relativement simples à réutiliser :
http://www.rgagnon.com/javadetails/java-0014.html
17 sept. 2007 à 12:42
14 sept. 2007 à 15:21
Pour lancer une commande Système, la base c'est
Process p = Runtime.getRuntime().exec(String maCommande);
et si on veut attendre la fin de l'execution:
p.waitFor();
Problème, on ne voit pas le résultat. Pire! Si la commande est sensée écrire beaucoup dans la console durant son exécution ou lorsqu'elle rencontre une erreur, cela peut bloquer le programme java!
Ceci pour la simple raison que Java récupère les flux d'entrées et de sortie du Process, et que si les flux sont remplis, il faut les vider sous peine de mettre Java indéfiniment en attente.
On récupère les flux de sortie grâce aux méthodes de Process:
getInputStream() et getErrorStream() .
Il faut ensuite les lire comme n'importe quel flux. Ceci est aussi la méthode pour récupérer le résultat d'une commande Système comme décrite plus haut.
Parce que Java récupère les flux d'entrée et sortie, les "pipes" et "redirections" ne fonctionne pas directement!
Il faut créer un Thread qui va lire le Process.getInputStream du premier Process et récrire le résultat dans le Process.getOutputStream() du second pour un pipe, ou un fichier pour une redirection.
Dernier Gros problème.. C'est que Java ne récupère pas les sortie fils.. Donc si on appelle un programme Système qui va lancer un second programme Système qui lui affichera le résultat... On n'a pas la sortie de se second Programme...
Seul alternative concluante je pense pour l'instant: générer un script à la volée qui lance le Programme avec une redirection dans un fichier (avec '> mon_fichier'), puis lancer le script avec Runtime, puis lire le fichier de sortie.. Solution lourde et plateforme spécifique mais ça marche...
Donc, non! Il ne suffit pas de lire l'API de sun pour maîtriser ce problème (d'où nos efforts).. Si maintenant, dans les nouvelles versions de Java, il y a de meilleur façon de faire.. Tout le monde sera heureux de le savoir...
14 sept. 2007 à 14:56
ciao :)
14 sept. 2007 à 13:32
17 août 2007 à 15:01
//je crée ma commande
Commande com=new Commande(StringMaCommande);
java.io.File sortie=new java.io.File("monChemin/resultat.txt");//mon fichier de sortie
try {
FileOutputStream out=new FileOutputStream(sortie);
com.redirectSimple(out);//ici je configure la sortie de la commande
com.exec();//ici je lance le bazar
com.waitFor(); //ici j'attend que la commande soit bien execute
out.close(); //et seulement après je ferme le fichier....
} catch (IOException ex) {
ex.printStackTrace();
}
9 août 2007 à 12:08
9 août 2007 à 11:57
pour le flux de sortie essaye de faire une redirection comme sous unix (c'est le meme principe')avec '>' a la fin de la commande a executer dens un fichier et puis le lire. et g une question malgré que cela peut etre un peu luin de notre sujet mé esseque quelcun pourais me donner la commande a executer pour arreter un prossesus??
merci d'avance
3 août 2007 à 14:07
il est vrai que en Java, la gestion des commandes systèmes n'est pas géniale.. C'est pourquoi j'avais fait à l'époque une API pour m'en sortir. Elle permet de lancer simultanément des commandes systèmes et de savoir quand elles sont terminées pour les coordonner.
Mais bon, tout cela pour dire que à la demande de plusieurs personnes, pour gérer les redirections, et les "pipes", j'ai fait une nouvelle version. l'API s'appelle ProgRunner et la classe dont tu auras besoin pour lancer une commande système s'appelle..... "Commande".
On l'utilise ainsi:
//je crée ma commande
Commande com=new Commande(StringMaCommande);
java.io.File sortie=new java.io.File("monChemin/resultat.txt");//mon fichier de sortie
try {
FileOutputStream out=new FileOutputStream(sortie);
com.redirectSimple(out);//ici je configure la sortie de la commande
com.exec();//ici je lance le bazar
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
L'API (jar, javadoc et source) et dispo ici:
http://www-bio3d-igbmc.u-strasbg.fr/~dkieffer/Librairie/librairie.html
Bonne chance a tous pour vos codes...
31 juil. 2007 à 14:52
Quand tu fait process.getErrorStream() et process.getInputStream(), tu récupère les sorties standards et d'erreur du process.
Tu peut ensuite les mettres dans un fichier en faisant un truc du genre :
cmd= "generate -package c://test//grammarFolder -grammar .Tgram"
Process process = Runtime.getRuntime.exec(cmd);
InputStream standardOut = process.getInputStream();
process.waitFor();
File temp = new File("fileTemp") ;
puis ensuite tu rempli le fichier avec l'InputStream que tu à récupéré en fesant process.getInputStream. Je me rappelle plus comment on rempli un fichier avec une InputStream mais tu doit trouver facilement sur google.
Par contre moi j'ai une autre question :
Comment faire un Runtime.exec() avec les droits administrateur ??
24 juil. 2007 à 15:45
String cmd= "nuance-compile c://test//grammar English.America -auto_pron -o c://test//grammarFolder";
Runtime runtime1 = Runtime.getRuntime();
try {
Process process = runtime1.exec(cmd);
//mettre fin au processus
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
}
catch (Exception e) {
}
mon pb que j'ai besion de lancer une autre commande mais j'ai besion de rédiger la sortie de la commande dans un fichier
donc la commande est comme suit:
cmd= "generate -package c://test//grammarFolder -grammar .Tgram > fileTemp"
mais la redérection " > "ne marche pas alors je fait koi??
please aide moi
9 mai 2007 à 15:07
est ce que t'as essayé
cmd="cmd /c c:\\fichier.bat" !!
PUIS
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
sinon poste le bout de code ou envoi le par mail pour voir ce qui se passe!!
ciao
9 mai 2007 à 14:05
Tout d'abord merci pour ton code Larsson.
J'ai un petit probleme, en effet mon but est d'ouvrir un fichier .bat sous windows XP.
J'ai donc recuperer le code tel quel et j'ai choisit la partie :
//Win NT(XP...) : pour lancer un .bat
Mais ca ne marche pas.
J'ai vu egalement que Larsson a mis que le code ne marchait pas du premier coup, qu'il fallait initialiser 'cmd'.
Ma question est il faut initialiser la variable String cmd ?
Dans mon cas c'est ce que j'ai fait mais ca ne marche toujours pas . Il n'y peut etre quelque chose que je n'ai pas bien saisi.
Donc si quelqu'un peut m'aider ce serait tres sympa car ce code correspond exactement avec ce je veux faire.
Merci d'avance.
Cordialement.
4 mai 2007 à 17:08
Le système doit permettre d'échanger (recevoir/modifier/renvoyer (des documents renseignes) des schémas techniques) tout type de fichiers entre les chefs de chantier depuis leur lieu de travail (chantier) vers les deux sites de la base arrière (: Protec-feu et TPI).
Le système doit permettre aux chefs de chantier d'effectuer des requêtes sur le serveur de la base Documentaire de PF/TPI.
Le système doit permettre de récupérer des informations de déréférencement (position et timbre temporel).
Le système doit rendre obligatoire la validation des différents champs du document avant sauvegarde
Le système doit permettre la validation par les achats des bons de commande émis par les itinérants ainsi que la vérification de la conformité des commandes émis par celui ci.
Le système doit permettre la vérification de la bonne exécution des commandes (commanditaires/fournisseurs/transporteurs/réception)
Le système doit archiver toutes les informations envoyées par les chefs de chantier sur un serveur de backup qui servira de zone de stockage et permettra la sécurisation des données.
Le système doit permettre de retrouver toutes les informations contenues sur une tablette PC en cas de perte/vol/destruction/panne de celui-ci.
sur le Systeme se trouve les applications suivantes:
Adobe Reader 7.0,windows media connect,Assistance a distance,Journal windows,windows Movie Maker,ITV BlueSoleil,Outlook Express,MicrosoftMapPointEurope2004,Realtek Sound Manager,Internet Explorer, MSN,Windows Mdia Player.
Comment interfacer ces differentes application pour excuter les differentes fonctionnalites du Systeme à realiser en se servant du language java,et quelles sont les nouvelles applications qui manquent.
Je vous remercie de toute l'attention que vous voudrez bien accorder a ma presente preoccupation.
14 déc. 2006 à 15:22
13 déc. 2006 à 16:36
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
BufferedReader r1 = new BufferedReader(
new InputStreamReader(p.getInputStream())
);
String x;
while ((x = r1.readLine()) != null) {
System.out.println(x);
}
r1.close();
p.waitFor();
si vous avez un exemple avec la classe compile, merci de le diffuser
13 déc. 2006 à 16:24
pour avoir utiliser la classe compiler
13 déc. 2006 à 16:06
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Compiler.html
bien sur faut le jdk d'installé
13 déc. 2006 à 15:57
Je ne vois pas pkoi ça marche pas.
bref, le plus important c'est pas comment l'executer cette classe (car ne fait aucun veritable boulot) mais comment on peut l'exploiter dans de vrai programme.
Merci pour votre remarque, j'essayerais de ma part.
ciao
13 déc. 2006 à 15:51
NB : j'utilise Netbeans, je veux faire une fonction compile(fname) qui permet de compiler un fichier java
20 août 2006 à 15:30
mais voila,
je suis tombé "par hasard" sur ce site :
http://javaalmanac.com
en consultant java.com ; )
et apperement on peut récupérer facilement la sortie
du processus créé en 4 lignes .
attention :
try {
// Execute command
String command = "ls";
Process child = Runtime.getRuntime().exec(command);
// Get the input stream and read from it
InputStream in = child.getInputStream();
int c;
while ((c = in.read()) != -1) {
process((char)c);
}
in.close();
} catch (IOException e) {
}
et voila ( c'était sur http://javaalmanac.com/egs/java.lang/ReadFromCommand.html?l=rel ) .
si j'avais sû .
; Laughing Out Loud ...
après j'ai pas eclipse sur moi la tout de suite,
pour voir la classe de process(char) .
(\__/)
(+'o'+)
(")v(") pourvu que ca marche
(inspiré de nainwak)
18 août 2006 à 11:38
30 juin 2006 à 12:21
quimarche pour tout OS normalment
2 juin 2006 à 13:38
j'ai un projet en java/C avec tout un tas d'interactions
entre interface-java et C .
a la base c'est un projet avec des pipes,...
grace a tes sources, je gagne un max de temp pour ces interactions,
merci larsson pour avoir lancé le sujet !
bravo !!
20 avril 2006 à 09:56
Pour mon projet j'ai fait une classe qui gère les appels de commande externe. J'ai mis le code source de cette classe ainsi que celui d'un exemple d'utilisation sur :
http://www-bio3d-igbmc.u-strasbg.fr/~dkieffer/sourceJava/ProgRunner.htm
et http://www-bio3d-igbmc.u-strasbg.fr/~dkieffer/sourceJava/TestProgRunner.htm
J'espère que celà vous sera utile.
10 déc. 2005 à 07:54
Bon courage... bonne prog
'BriBus
10 déc. 2005 à 01:36
en fait je cherchais une class java qui le gérait, les redirections système je les connais, mais par contre j'ai pas trouvé de méthode à partir de Runtime ou de Process qui permettait de stocker la sortie standard (stdout si vous preferez) dans une var . Par exemple, style :
String date = new String("");
date = Runtime.getRuntime().exec("time").CapturerSortie();
Enfin l'histoire de la redirection est pas bete vi... suffit d'ouvrir le fichier avc java après après tout... Mais ça fait un peu "bidouillage", pardonnez-moi l'expression.
Merci quand meme, parce que ça ne m'était pas vraiment venu à l'esprit :)
Si k1k1 a une solution quand meme, pour faire ça de façon directe, chuis preneur :-)
9 déc. 2005 à 11:54
bon en ce qui concerne la cas de redirection de la sortie standard dans un fichier la solution est donnée par AbriBus.
en ce qui concerne une variable(unix):
2 cas se presentent:
une variable systeme
une var java de ton code
1-- Var systeme ;tu execute les commandes suivantes:
export VAR
VAR=`ps`
echo $VAR
ces trois etapes font une creation de var "VAR", ensuite on enregistre le resultat de la cmde "ps" dans cette var (mais on perd le formatatge de donnée essais pour voir qu'est ce que ça donne)
2-- une var java: je n'est pas vraiment une solution qui marche , mais pense un peut a traiter les information qui sont contenu dans un fichier de redirection comme le message precedent le décrit avec l'aide de l'api java.util.regex.* c'est une api disons "exprexssion regulière comme dans perl" et pour plus d'information vas dans: http://java.sun.com/j2se/1.5.0/docs/api/
cordialement Larsson
A+
9 déc. 2005 à 10:04
C:\>[nomDeLaCommande] [parametresDeLaCommande] > [fichierDeDestination]
ca c'est pour creer/ecraser le fichier qui contiendra ce que t'aurait affiché la fenetre (TEXT ONLY !!)
sinon, tu peux egalement décider de concatener ce que t'affichera la sortie de l'execution de ta commande a un fichier deja existant (sans ecraser donc le resultat precedant mais en le mettant a la suite) auquel cas tu utilisera la ligne de commande suivante:
C:\>[nomDeLaCommande] [parametresDeLaCommande] >> [fichierDeDestination]
Voila... pour les autre OS desolé je connais pas.
j'espere que c'etait bien le sens de ta question et que ca pourra t'etre utile.
Bon courrage
AbriBus
9 déc. 2005 à 09:56
Par contre saurais-tu s'iol estpossible de rediriger la sortie standard vers une variable ?
Je m'explique : Si tu lances la commande ps sous unix (ou tasklist sous windows), tu fais comment pour récupérer le résultat ?
Merci !
30 juin 2005 à 09:41
Merci
9 juin 2005 à 15:57
désolé ;)
9 juin 2005 à 15:50