précédent | suivant | table des matières

Classes Runtime, Process, ProcessBuilder et Desktop

Sommaire
  1. Runtime
  2. Process
  3. ProcessBuilder
  4. Desktop

(Démonstration)

Les classes Runtime, Process, ProcessBuilder et Desktop permettent de lancer des applications.

1 Runtime

L'exécution d'une application se fait grâce à l'une des méthodes exec() de la classe Runtime. La classe Runtime est une classe singleton, dont on obtient l'instance unique par un appel de la méthode de classe getRuntime().

Runtime runtime = Runtime.getRuntime();
Process exec(String[] tCom)
Exécution d'une commande avec ses arguments.
Process exec(String[] tCom, String[] env)
Exécution d'une commande avec ses arguments, et des variables d'environnement. Les variables d'environnement sont spécifiées sous la forme nom=valeur. env peut valoir null si on ne veux pas modifier les varibles d'environnement.
Process exec(String[] tCom, String[] env, File rep)
Exécution d'une commande avec ses arguments, des variables d'environnement, dans le répertoire de travail rep.
Process exec(String com)
Exécution d'une commande.
Process exec(String com, String[] env)
Exécution d'une commande en spécifiant des variables d'environnement.
Process exec(String com, String[] env, File rep)
Exécution d'une commande en spécifiant des variables d'environnement des variables d'environnement, dans le répertoire de travail rep.

Dans une commande, un espace est un séparateur, alors que, quand le paramètre est un tableau, chaque élément du tableau est la commande ou un paramètre de la commande :

Runtime runtime = Runtime.getRuntime();
runtime.exec(new String[] { "C:\\Program Files\\toto.exe" } );
est interprété comme l'exécution de l'application toto.exe qui se trouve dans le répertoire "C:\\Program Files"
Runtime runtime = Runtime.getRuntime();
runtime.exec("C:\\Program Files\\toto.exe" );
est interprété comme l'exécution de l'application c:\\Program avec le paramètre Files\\toto.exe !

2 Process

Les méthodes exec de la classe Runtime retournent une instance de la classe Process qui représente le processus généré par l'exécution de la commande.

void destroy()
Destruction du processus.
int exitValue()
Retourne l'état de la fin de processus (0 si ça s'est bien terminé).
InputStream getInputStream()
Retourne le fichier de sortie normale du processus, dans lequel nous pouvons lire les écritures faites par le processus.
InputStream getErrorStream()
Retourne le fichier de sortie erreur du processus, dans lequel nous pouvons lire les écritures faites par le processus.
OutputStream getOutputStream()
Retourne le fichier d'entrée du processus, dans lequel nous pouvons ecrire au processus.
void waitFor()
L'application attend la fin de l'exécution du processus.

Pour éviter que l'application qui a lancé un processus externe sooit bloquée sur la lecture des sorties normales ou des erreurs du processus, il faut faire ces lectures dans un Thread séparé.

class Sortie extends Thread{
      public void run() {
         try {
           InputStream is = pCommande.getInputStream();
           BufferedReader br = new BufferedReader(new InputStreamReader(is));
           for(;;){
              String s = br.readLine();
              if(s==null) break;
              //s contient une ligne envoyée par le processus pCommande
           }
         } catch (IOException ioe) {}
     }
   }
   
   class Erreur extends Thread{
         public void run() {
            try {
              InputStream is = pCommande.getErrorStream();
              BufferedReader br = new BufferedReader(new InputStreamReader(is));
              for(;;){
                 String s = br.readLine();
                 if(s==null) break;
                 //s contient une ligne erreur envoyée par le processus pCommande
              }
            } catch (IOException ioe) {}
        }
   }
   
   // lancement de la commande
   Runtime rt = Runtime.getRuntime();
   try {
      String[] args = { "cmd.exe", "/c", commande };
      pCommande = rt.exec(args);
      Sortie s = new Sortie();   s.start();
      Erreur err = new Erreur(); err.start();
   } catch (IOException e1) {
   } 

3ProcessBuilder

Un ProcessBuilder peut gérer :

Exemple :

   String[] args = { "cmd.exe", "/c", commande };
   try {
      ProcessBuilder pb = new ProcessBuilder(args);
      pb = pb.redirectErrorStream(true); // on mélange les sorties du processus
      Process p = pb.start();
      InputStream is = p.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String ligne; 

      while (( ligne = br.readLine()) != null) { 
         // ligne contient une ligne de sortie normale ou d'erreur
      }
      } catch (IOException e) {

      } 

4Desktop

Depuis Java 1.6, la classe Desktop permet de faire les opérations suivantes : 

static Desktop getDesktop()
Retourne l'instance de Desktop.
static boolean isDesktopSupported()
Retourne true si la classe Desktop est supportée.
boolean isSupported(Desktop.Action action)
Retourne true si une action particulière de la classe Desktop est supportée.
void browse(URI uri)
Lance le navigateur par défaut, pour afficher la page donnée en paramètre.
void edit(File file)
Lance l'applicarion éditeur associé au fichier en paramètre.
void open(File file)
Lance l'application définie pour l'ouverture du fichier.
void mail()
Lance l'application de mail par défaut.
void mail(URI mailtoURI)
Lance l'application de mail par défaut, avec une URI.
void print(File file)
Imprime le fichier sur l'imprimante par défaut.

Exemple : 

if(Desktop.isDesktopSupported()){
   if(Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)){
      Desktop dt = Desktop.getDesktop();
      try {
        dt.browse(new URI("http://x"));
      } catch (IOException e) {
         ...
      } catch (URISyntaxException e) {
         // syntaxe de l'URI incorrecte...
      }
   }else
      // action navigation non supportée...
}else
   // Desktop non supportée...

haut de la page