Executer un executable externe en Java [2017]

Résolu
Utilisateur anonyme -  
KX Messages postés 19031 Statut Modérateur -
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();
}

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
    1. Utilisateur anonyme
       
      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
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
    3. Utilisateur anonyme
       
      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
    4. Utilisateur anonyme
       
      Même en ajoutant des librairies ...
      0
    5. KX Messages postés 19031 Statut Modérateur 3 020
       
      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
  2. Utilisateur anonyme
     
    Même si il le sujet est résolu il y a quelque chose de plus simple :

    Desktop.getDesktop().open((new File("path")));
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      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