web-dev-qa-db-fra.com

Démarrage d'un processus en Java?

Existe-t-il un moyen de démarrer un processus en Java? dans .Net, cela se fait par exemple avec:

System.Diagnostics.Process.Start("processname");

Existe-t-il un équivalent dans Java afin que je puisse ensuite laisser l'utilisateur trouver l'application et que cela fonctionnera pour n'importe quel système d'exploitation?

31
jmasterx

http://www.rgagnon.com/javadetails/Java-0014.html

import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.nio.file.Paths;

public class CmdExec {

public static void main(String args[]) {
    try {
        // enter code here

        Process p = Runtime.getRuntime().exec(
            Paths.get(System.getenv("windir"), "system32", "tree.com /A").toString()
        );

        // enter code here

        try(BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
            String line;

            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
        }

    } catch (Exception err) {
        err.printStackTrace();
    }
  }
}

Vous pouvez obtenir le chemin local à l'aide des propriétés système ou d'une approche similaire.

http://download.Oracle.com/javase/tutorial/essential/environment/sysprop.html

31
James P.

Voir Runtime.exec() et la classe Process . Dans sa forme la plus simple:

Process myProcess = Runtime.getRuntime().exec(command);
...

Notez que vous devez également lire la sortie du processus (par exemple: myProcess.getInputStream()) - sinon le processus se bloquera sur certains systèmes. Cela peut être très déroutant la première fois et devrait être inclus dans toute introduction à ces API. Voir la réponse de James P. pour un exemple.

Vous pourriez également vouloir examiner la nouvelle classe ProcessBuilder , ce qui facilite la modification des variables d'environnement et l'appel de sous-processus:

Process myProcess = new ProcessBuilder(command, arg).start();
...
22
NullUserException

La bibliothèque de classes Java Java représente les processus externes utilisant la classe Java.lang.Process . Les processus peuvent être générés à l'aide d'une Java.lang.ProcessBuilder :

Process process = new ProcessBuilder("processname").start();

ou l'ancienne interface exposée par les méthodes exec surchargées sur la classe Java.lang.Runtime :

Process process = Runtime.getRuntime().exec("processname");

Ces deux extraits de code généreront un nouveau processus, qui s'exécute généralement de manière asynchrone et peut être interagi avec l'objet Process résultant. Si vous devez vérifier que le processus est terminé (ou attendre qu'il se termine), n'oubliez pas de vérifier que la valeur de sortie (code de sortie) retournée par process.exitValue() ou process.waitFor() est comme prévu (0 pour la plupart des programmes), car aucune exception n'est levée si le processus se termine anormalement.

Notez également que du code supplémentaire est souvent nécessaire pour gérer correctement les E/S du processus, comme décrit dans la documentation pour la classe Process (emphase ajoutée):

Par défaut, le sous-processus créé n'a pas son propre terminal ou console. Toutes ses opérations d'E/S standard (c'est-à-dire stdin, stdout, stderr) seront redirigées vers le processus parent, où elles seront accessibles via les flux obtenus à l'aide des méthodes getOutputStream (), getInputStream () et getErrorStream (). Le processus parent utilise ces flux pour alimenter l'entrée et obtenir la sortie du sous-processus. Étant donné que certaines plates-formes natives ne fournissent qu'une taille de tampon limitée pour les flux d'entrée et de sortie standard, l'échec d'écrire rapidement le flux d'entrée ou de lire le flux de sortie du sous-processus peut entraîner le blocage du sous-processus, voire un blocage. .

Une façon de s'assurer que les E/S sont correctement gérées et que la valeur de sortie indique le succès est d'utiliser une bibliothèque comme jproc qui traite des subtilités de capture de stdout et stderr, et offre une interface synchrone simple pour exécuter des processus externes:

ProcResult result = new ProcBuilder("processname").run();

jproc est disponible via maven central:

<dependency>
      <groupId>org.buildobjects</groupId>
      <artifactId>jproc</artifactId>
      <version>2.2.0</version>
</dependency>
15
Felix Leipold