Executer un executable externe en Java [2017]

Résolu/Fermé
Utilisateur anonyme - Modifié le 19 juil. 2017 à 02:50
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 22 juil. 2017 à 18:29
Bonjour/Bonsoir,

je cherche à lancer une application externe avec du code Java, l'app se lance dans le Gestionnaire de taches mais n'apparait pas.
Voici le code que j'utilise (qui est faux je pense):

try {
String[] cmdAndArgs = new String[]{"cmd", "/c", "path"};
Runtime.getRuntime().exec(cmdAndArgs);
}
catch (Exception e) {
e.printStackTrace();
}
A voir également:

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 juil. 2017 à 07:29
Bonjour,

Pas besoin de "cmd /c" fait juste ta commande "path"

Remarque : si tu es censé récupérer un affichage il faut rediriger les flux.
0
Utilisateur anonyme
19 juil. 2017 à 11:26
Avec getInputStream et getOutputStream ou ProcessBuilder ou bien autre ?
Je n'ai jamais eu l'occasion jusqu'à aujourd'hui de gérer les flux.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 19 juil. 2017 à 11:32
Par exemple :

public static void main(String[] args) throws IOException {
    Process p = Runtime.getRuntime().exec(new String[]{"ping","localhost"});
    Charset charsetMsDosLatin1 = Charset.forName("Cp850");
    print(p.getInputStream(), System.out, charsetMsDosLatin1);
    print(p.getErrorStream(), System.err, charsetMsDosLatin1);
    System.out.println(p.exitValue());
}

public static void print(InputStream in, PrintStream out, Charset charset) {
    try (Scanner sc = new Scanner(in, charset.name())) {
        while (sc.hasNextLine())
            out.println(sc.nextLine());
    }
}
0
Utilisateur anonyme
19 juil. 2017 à 11:49
Ceci marche avec certains executables mais d'autres n'apparaissent pas (se sont des cmd qui doivent s'ouvrir pas une fenêtre normal).
Il n'existe pas d'alternative au c# de :
 Process.Start
?
0
Utilisateur anonyme
19 juil. 2017 à 11:51
Même en ajoutant des librairies ...
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 juil. 2017 à 11:56
La commande est immédiatement lancé à l'appel de la méthode exec, il n'y a pas besoin d'avoir une méthode en plus pour démarrer ce qui l'est déjà.

Après ce qu'il peut se passer c'est que le programme soit en attente de saisir quelque chose au clavier par exemple, dans ce cas il faut aussi se brancher sur ce flux.

Remarque : dans certains cas le code précédent (qui n'était qu'un exemple) peut également poser problème car on ne lit les messages d'erreurs qu'une fois tous les messages normaux lus, pour être complet il faudrait mettre ces deux codes dans des threads en parallèles qui affichent les deux flux en même temps.
0
Utilisateur anonyme
22 juil. 2017 à 17:51
Même si il le sujet est résolu il y a quelque chose de plus simple :

Desktop.getDesktop().open((new File("path")));
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 juil. 2017 à 18:29
Cela dépend en fait de ce que l'on veux faire...

Runtime.exec est fait pour démarrer un programmer et interagir avec, en lui passant des paramètres, en récupérant les flux d'entrée/sortie, attendre la fin du processus, etc.

Desktop.open est fait pour ouvrir un fichier, ça l'ouvre avec le programme par défaut configuré sur le système d'exploitation (donc pas forcément celui qu'on voudrait)
0