Developpez Magazine Edition de Février-Mars 2007. Numéro 7. Magazine en ligne g

Developpez Magazine Edition de Février-Mars 2007. Numéro 7. Magazine en ligne gratuit. Diffusion de copies conformes à l’original autorisée. Réalisation : Baptiste Wicht Rédaction : la rédaction de Developpez Contact : magazine@redaction-developpez.com Numéro 8 – Février-Mars 2007 Developpez Magazine est une publication de developpez.com Page 1 Index Java Page 2 Linux/BSD/Unix Page 7 Développement Web Page 12 DotNet Page 17 C & C++ Page 22 XML Page 29 SGBD Page 33 Windows Page 37 Visual Basic Page 42 Delphi Page 47 Ruby Page 55 Le Club Page 61 Liens Page 62 Tutoriel C Ecriture de Driver en C Dans cet article, vous verrez les bases pour créer vos propres drivers sous linux grâce au langage C. par Benjamin Roux Page 22 Editorial Developpez.com Magazine revient pour son 8ème numéro avec toujours autant (sinon plus) d'articles, de tutoriels, de FAQ, ... N'hésitez pas à passer sur les forums pour donner votre avis ou faire des suggestions pour cette publication La rédaction Article XML La structure des fichiers OpenXML Faites connaissance avec l'organisation interne des fichiers OpenXML, le nouveau format de document Office de Microsoft. par Eric Grimois Page 29 Java Les derniers tutoriels et articles Exécuter une application externe en Java 1. Introduction Il arrive fréquemment que l'on doive lancer une application externe depuis un programme Java. Java nous le permet, cependant beaucoup de personnes rencontrent des difficultés souvent dues à une méconnaissance de certains principes pourtant fondamentaux. 2. Lancer une application externe 2.1. La classe Runtime L'exécution d'une application externe se fait grâce aux méthodes exec() de la classe Runtime. Chaque application Java possède une instance unique de la classe Runtime qui lui permet de s'interfacer avec son environnement. L'instance se récupère avec la méthode statique getRuntime(). Runtime runtime = Runtime.getRuntime(); Pour lancer votre application externe il vous suffit maintenant d'appeler l'une des six méthodes exec() de la classe Runtime et dont voici les déclarations : public Process exec(String command); Permet d'exécuter une ligne de commande dans un processus séparé. public Process exec(String[] cmdarray); Permet d'exécuter une commande avec ses arguments dans un processus séparé. public Process exec(String[] cmdarray, String[] envp); Permet d'exécuter une commande avec ses arguments dans un processus séparé en spécifiant des variables d'environnement. public Process exec(String[] cmdarray, String[] envp, File dir); Permet d'exécuter une commande avec ses arguments dans un processus séparé en spécifiant des variables d'environnement et le répertoire de travail. public Process exec(String command, String[] envp); Permet d'exécuter une ligne de commande dans un processus séparé en spécifiant des variables d'environnement. public Process exec(String command, String[] envp, File dir); Permet d'exécuter une ligne de commande dans un processus séparé en spécifiant des variables d'environnement et le répertoire de travail. Remarque : Les variables d'environnement spécifiées doivent l'être selon le format nom=valeur. Un point important est que si vous voulez lancer une application externe en lui passant des paramètres, il faut toujours passer par une des méthodes exec() attendant un tableau de String. Même s'il est possible d'utiliser une des méthodes exec() attendant un simple String pour lancer une application avec des paramètres : Runtime runtime = Runtime.getRuntime(); runtime.exec("monappli param1 param2"); cela risque de poser des problèmes si l'un de vos paramètres contient un espace. En effet, java utilise le caractère espace pour extraire les différents paramètres de la ligne de commande. Donc si vous avez un paramètre du genre "un paramètre avec des espaces", Java le comprendra comme cinq paramètres différents ("un", "paramètre", "avec", "des", "espaces"). C'est pourquoi il faut toujours utiliser un tableau de String pour passer des paramètres à une application externe. Runtime runtime = Runtime.getRuntime(); runtime.exec(new String[] { "monappli", "un paramètre avec des espaces", "param2" } ); Cette remarque est aussi valable si la commande elle-même contient des espaces. Runtime runtime = Runtime.getRuntime(); runtime.exec(new String[] { "C:\\Program Files\\MonAppli\monappli.exe" } ); 2.2. La classe Process Comme vous l'avez sans doute remarqué, les différentes méthodes exec() renvoie un objet de type Process. Cette classe représente le processus de l'application externe et va nous permettre d'interagir avec lui. La classe Process, qui est abstraite, définit les 6 méthodes suivantes : ● la méthode destroy() qui permet de tuer le processus de l'application externe, ● la méthode exitValue() qui permet de récupérer la valeur de retour du processus de l'application externe, ● la méthode getErrorStream() qui permet de récupérer le flux d'erreur du processus de l'application externe, ● la méthode getInputStream() qui permet de récupérer le flux de sortie du processus de l'application externe, ● la méthode getOutputStream() qui permet de récupérer le flux d'entrée du processus de l'application externe, ● la méthode waitFor() qui met le thread courant en attente que le processus de l'application externe se termine. Numéro 8 – Février-Mars 2007 Developpez Magazine est une publication de developpez.com Page 2 3. Communiquer avec l'application Remarque : pour cette partie il est nécessaire de connaître le fonctionnement des flux d'entrée/sortie en Java (cf ce tutoriel sur le package java.io). 3.1. Récupération des flux Si besoin est, nous avons la possibilité de communiquer avec notre application externe au travers des trois flux récupérables par les méthodes getErrorStream(), getInputStream() et getOutputStream() de la classe Process : ● la méthode getErrorStream() permet de récupérer un InputStream représentant le flux d'erreur de l'application externe. ● la méthode getInputStream() permet de récupérer un InputStream représentant le flux de sortie de l'application externe. ● la méthode getOutputStream() permet de récupérer un OutputStream représentant le flux d'entrée de l'application externe. Remarque : au premier abord il peut paraître étrange de récupérer un InputStream pour le flux de sortie standard. Cependant il faut bien se placer au niveau de l'application Java. En effet, il s'agit de la sortie standard de l'application externe, l'application Java va lire ce flux qui est donc de son point de vue (en fait le notre) un flux d'entrée (idem pour le flux d'erreur). De même pour l'entrée standard de l'application externe, du point de vue de l'application Java il s'agit d'un flux de sortie puisqu'elle y écrit (d'où le OutputStream). 3.2. Consommation des flux L'un des problèmes majoritairement rencontré est le fait que l'application externe semble se bloquer. Cela est souvent dû à une mauvaise gestion des flux. En effet, il arrive que l'application externe envoie des données sur les flux de sortie sans que cela soit "visible" (notamment sur le flux d'erreur ou lorsque l'application externe est une interface graphique). Pour palier à ce problème, il est nécessaire de consommer tous les flux de sortie. De plus, chaque flux doit être géré dans un thread différent. Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("monappli"); // Consommation de la sortie standard de l'application externe dans un Thread separe new Thread() { public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = ""; try { while((line = reader.readLine()) != null) { //Traitement } } finally { reader.close(); } } catch(IOException ioe) { ioe.printStackTrace(); } } }.start(); // Consommation de la sortie d'erreur de l'application externe dans un Thread separe new Thread() { public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); String line = ""; try { while((line = reader.readLine()) != null) { // Traitement } } finally { reader.close(); } } catch(IOException ioe) { ioe.printStackTrace(); } } }.start(); 4. Mise en pratique La classe ProcessLauncher (Lien1) utilise les principes vus précédemment afin de lancer une application externe dans de bonnes conditions. 5. Remarques 5.1. La classe ProcessBuilder Depuis Java 5, nous avons à notre disposition la classe ProcessBuilder qui permet entre autres de fusionner les flux de sortie et d'erreur du Process. 5.2. JDIC et la classe Desktop L'API JDIC possède une classe très intéressante pour notre sujet. Il s'agit de la classe Desktop qui permet notamment d'ouvrir un fichier avec l'application qui lui est associée par le système. A noter cependant que vous n'aurez aucun contrôle sur le processus lancé et que vous ne pourrez pas communiquer avec lui. Pour plus d'information sur l'API JDIC, reportez vous au tutoriel JDesktop Integrated Components. 5.3. Java 6 et la classe Desktop Depuis Java 6, la classe Desktop a été intégrée dans l'API standard et est quasiment identique à sa soeur de l'API JDIC. 5.4. Les commandes Windows Une autre remarque concerne les commandes Windows. En effet certaines d'entre elles ne peuvent être lancées comme une application externe (la commande "dir" par exemple). Cela est du au fait qu'elles nécessitent le programme "cmd.exe" pour pouvoir être exécutées. Runtime runtime = Runtime.getRuntime(); runtime.exec(new String[] { "cmd.exe", "/C", "dir" }); Retrouvez l'article en ligne de Yann D'Isanto : Lien2 Numéro 8 – Février-Mars 2007 Developpez Magazine est une publication de developpez.com Page 3 SwingWorker (Java SE 6) 1. Introduction Java SE 6 offre une version totalement refaite de la classe SwingWorker. Cette classe permet de faciliter les interactions entre un thread utilisateur et l'EventDispatchThread. Pour utiliser la classe SwingWorker, il faut tout d'abord comprendre les problèmes et les motivations d'une telle abstraction. Ce tutoriel va tenter d'expliquer le but de cette classe, et de présenter un exemple d'utilisation. 2. L'EventDispatchThread Lorsque vous uploads/Industriel/ dev-mag-200702.pdf

  • 19
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager