IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment connaître la version de la JVM installée ?
auteur : Clément Cunin
Depuis une console :

java -version
Depuis un programme :
Lors de l'exécution, la version de la JVM est accessible via les propriétés système (Comment accéder aux valeurs des variables d'environnement ?).

String version = System.getProperty("java.vm.version");

Comment connaître le système d'exploitation depuis le programme ?
auteur : Clément Cunin
Bien que Java soit conçu pour fonctionner indépendament du système, il est parfoit utile de savoir lequel exécute notre programme. Cela permet, par exemple, de choisir si l'on doit exécuter Mozilla, Safari ou plutot Internet Explorer.

Pour cela, il suffit de consulter les variables d'environnement initialisées par la JVM :

String name = System.getProperty ( "os.name" );<br/>String version = System.getProperty ( "os.version" );
lien : Comment accéder aux valeurs des variables d'environnement ?
lien :

Comment arrondir un nombre ?
auteur : Clément Cunin
auteur : Johann Heymes
Arrondir un réel en entier :
Lors d'une conversion d'un réel en entier par une opération d'affection, Java se contente de tronquer la partie décimale.

double a = 1.99;int b = a; <comment>b=1</comment>
Un solution consiste à simplement incrémenter la valeur réelle de 0.5 avant la conversion.

double a = 1.8;<comment>Conversion avec arrondi </comment>int b = a+0.5; <comment>b=2</comment>
Arrondir un réel à 10<sup>-2</sup> :
On peux également faire un arrondi à 10<sup>-2</sup> à la main en faisant:

double a = 1.6666666<comment>Arrondir la valeur a 10^-2</comment>a *= 100;a = (int)(a+.5);a /= 100;
Il est très important de commenter ce genre d'astuce de programmation; dans le cas contraire votre code pourrait rapidement devenir imcompréhensible !

La classe java.lang.Math :
La classe <javaClass class="java.lang.Math"/> fournit un certain nombre de méthodes pour faire les arrondis (inférieur, supérieur ou au plus proche). Elles ont l'avantage d'être plus lisibles que le code fourni précédemment. En revanche, rien n'est prévu pour l'arrondi à 10<sup>-2</sup>.

Arrondir pour afficher :
En revanche, si le résultat est destiné à une conversion en chaîne de caractères, on peux faire beaucoup mieux grâce à la classe <javaClass class="java.text.DecimalFormat"/> (plus d'info ici)

lien :
lien : Comment convertir un nombre en chaîne formatée ?

Quel rôle joue les imports lors de la compilation ?
auteur : Clément Cunin
Le rôle des imports en Java est très différent de celui des includes en C / C++.

Les includes en C :
Lorsque le compilateur C (Le préprocesseur pour être précis) rencontre un include, il ouvre et analyse le fichier spécifié. Le contenu du fichier influs directement sur la compilation.

Les imports en Java :
Les imports en Java n'ont aucun impact sur le fichier compilé, ils servent uniquement à préciser les classes que vous souhaitez utiliser sans préciser chaque fois le nom du paquet. Une classe peut être utilisée sans avoir été importée, il suffit pour cela de préfixer le nom de la classe avec son nom de paquet.


Comment exécuter une application externe ?
auteur : Clément Cunin
Execution :
L'exécution d'un programme externe se fait grâce à la méthode <javaMethode class="java.lang.Runtime" methode="exec(java.lang.String)" parametres="(commande)" /> de la classe <javaClass class="java.lang.Runtime" />.

tryProcess proc = Runtime.getRuntime().exec("commande paramétrée"); catch (IOException e)
Communication :
    Il est possible de communiquer avec l'application grâce à l'objet <javaClass class="java.lang.Process" /> :
  • <javaMethode class="java.lang.Process" methode="destroy()" /> pour tuer l'application fille.
  • <javaMethode class="java.lang.Process" methode="waitFor()" /> pour attendre la fin de l'application fille (Attention à ne pas bloquer l'exécution du processus d'évènement awt).
  • <javaMethode class="java.lang.Process" methode="getErrorStream()" />, <javaMethode class="java.lang.Process" methode="getInputStream()" /> et <javaMethode class="java.lang.Process" methode="getOutputStream()" /> pour communiquer avec l'application.
  • <javaMethode class="java.lang.Process" methode="exitValue()" /> pour connaître l'état de sortie de l'application.

lien :

Comment faire une énumération en Java ?
auteur : Clément Cunin
Voici trois solutions :

1<sup>ère</sup> solution :

public class MonEnumpublic final static int Val1=0;public final static int Val2=1;public final static int Val3=2;
On peut ensuite utiliser MonEnum.Val1, MonEnum.Val2 etc, ou mieux on peut faire une interface plutôt qu'une classe afin que les classes l'implémentant puissent directement appeler Val1, Val2...

Le problème reste le typage des éléments, rien n'empêche de passer un objet d'une énumération à la place d'une autre.

2<sup>ème</sup> solution :
Cette deuxième catégorie de solutions, plus complexes, permet d'éviter ce problème. On peut par exemple penser à utiliser des instances de classes :

public final class MonEnum1private MonEnum1()<comment>Rien à faire</comment><comment>liste des valeurs</comment>public final static MonEnum1 Val1 = new MonEnum1();public final static MonEnum1 Val2 = new MonEnum1();public final static MonEnum1 Val3 = new MonEnum1();
Ainsi un éventuel objet de type MonEnum2 ne pourra jamais être utilisé à la place d'un objet de type Enum1 (Enum1.Val1 Enum1.Val2 ...).

2<sup>ème</sup> bis solution :
La 2<sup>ème</sup> solution pose un autre problème, il reste possible d'utiliser la valeur 'null' alors que celle-ci n'appartient pas au domaine de notre énumération. Pour ce faire, rien de plus simple, si on considère val1 comme la valeur par défaut, on la déclare de la manière suivante :

public final static Enum1 val1 = null;
De cette manière il devient totalement impossible de passé un Enum1 non reconnu !

3<sup>ème</sup> solution :
Le projet jakarta propose quelques classes pour vous aider à gérer plus efficacement vos énumérations, tout en restant simple et efficace : http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/enum/package-summary.html.

Conclusion :
Les deux dernières méthodes posent toutefois un problème, le seule type d'argument accepté par un switch est l'entier. Il est donc impossible d'utiliser ces méthodes là où elle sont le plus souvent attendues. Il n'existe donc pas de solution miracle, à vous de choisir la solution qui correspond le mieux à vos contraintes.

lien : http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang/enum/package-summary.html

Comment faire en sorte que le paramètre int de ma méthode soit modifié en retour ?
auteur : Clément Cunin
En Java les types de base sont passés aux méthodes par valeur, ils ne peuvent pas être modifiés. Il va falloir utiliser une instance de classe "encapsulant" un entier pour effectuer la modification. Attention la classe fournie Integer ne permet pas la modification et est donc inutile dans ce cas.

Exemple :

class MonEntier<comment>champ privé :</comment>private int value;<comment>mise à jour de la valeur</comment>public void setValue(int newValue)value = newValue;<comment>Acces à la valeur</comment>public int getValue()return( value);
Dans la méthode maMethode faire :

public void maMethode (MonEntier i)i.setValue(maNouvelleValeur);

Comment accéder aux valeurs des variables d'environnement ?
auteur : Clément Cunin
Variable d'environnement du système :
L'accès aux variables d'environnement se fait par l'intermédiaire de la classe <javaClass class="java.lang.System" /> et plus précisément par la méthode <javaMethode class="java.lang.System" methode="getProperty(java.lang.String)" parametres="(clé)" />. Cette méthode donne accès à toutes les variables définies par le système. Des variables peuvent facilement être initialisées lors du lancement du programme en les ajoutant à la ligne de commande :

java -DTEST="test" nom_programme<comment> Création d'une variable : TEST = "test"</comment>
Variable d'environnement de Java :
Se baser sur les variables du système n'étant pas très portable, Java définit un certain nombre de variables de façon indépendante de la plateforme d'exécution.
Exemple :

System.getProperty("user.dir")System.getProperty("java.home")System.getProperty("os.name")
Connaître la liste des variables d'environnemnt :
La liste des variables d'environnement est disponible par la méthode <javaMethode class="java.lang.System" methode="getProperties()" /> de la classe <javaClass class="java.lang.System" />.
Programme affichant la liste de toutes les variables :

java.util.Enumeration liste = System.getProperties().propertyNames();String cle;while( liste.hasMoreElements() )cle = (String)liste.nextElement();System.out.println( cle + " = " + System.getProperty(cle) );
lien :

Comment créer son propre Listener ?
auteur : Johann Heymes
Cas de figure :
Un composant donné a besoin d'informer un ou plusieurs composants externes que certains événements se sont produits.

Un petit exemple :
Le composant MonBouton a besoin d'informer une liste d'objets que le bouton gauche de la souris est appuyé et que le bouton de la souris a été relaché.

Définir une nouvelle interface :

public interface MonBoutonMouseListener extends EventListenerpublic void boutonGauchePresse (EventObject e);public void boutonGaucheRelache (EventObject e);
class monBoutton :

<comment>import nécessaire :</comment>import javax.swing.event.EventListenerList; <comment>attribut :</comment>protected EventListenerList listenerList; <comment>instanciation nécessaire : (à faire dans son constructeurou dans une méthode appelée par le constructeur)</comment>this.listenerList = new EventListenerList (); <comment>méthode à faire :permet d'ajouter un composant dans la liste de ceux qui veulentêtre informés de l'évènement</comment>public void addMonBoutonMouseListener (MonBoutonMouseListener l)this.listenerList.add (MonBoutonMouseListener.class, l); <comment>enlève un objet qui est actuellement écouteur de l'évènement</comment>public void removeMonBoutonMouseListener (MonBoutonMouseListener l)this.listenerList.remove (MonBoutonMouseListener.class, l); <comment>lance un évènement à tous les objets écouteurs(== appelle la méthode boutonGauchePresse sur tous les objetsécouteurs de la liste)</comment>protected void fireboutonGauchePresse ()MonBoutonMouseListener [] listeners = (MonBoutonMouseListener [])<br_l/> listenerList.getListeners( MonBoutonMouseListener.class);EventObject e = new EventObject (this);for (int i = listeners.length-1; i>=0; i--)listeners [i].boutonGauchePresse (e);
Il suffit ensuite d'appeler cette méthode à chaque fois que l'évènement approprié est généré.

téléchargement : Exemple d'implémentation.

Comment créer un Jar exécutable ?
auteur : Clément Cunin
Pour rendre un Jar exécutable, il faut indiquer la classe principale de l'application en utilisant un fichier texte appelé 'Manifest'.

Fichier 'Manifest' :

Manifest-Version: 1.0Created-By: totoMain-Class: monPackage.maClasse<comment>optionel :</comment>Class-Path: autreFichiers.jar
Création du fichier Jar :
Enfin, il faut créer le fichier Jar avec le fichier Manifest grâce à la commande :

jar -cmf Manifest MonJar.jar *.class
lien : http://developer.java.sun.com/developer/Books/javaprogramming/JAR/basics/run.html

Comment resoudre le problème entre Big et Little Endian ?
auteur : Sebastien Andreo
Big et Little Endian, c'est quoi ?
Tout d'abord il faut savoir qu'un type de base tel que int, short, long sont représentés sur 1 ou plusieurs octets. Par exemple un short est représenté sur 16bits soit 2 octets(en Java). Ces octets peuvent ètre organisé suivant 2 ordres :

Big Endian : L'octet de poids le plus fort (Most Significant Byte) en premier c'est aussi le format utilise pour le transfert des donnees sur les reseaux.
exemple d'un short Big endian (nota le 0x est pour la representation hexadecimal)
short value = 0x2DA5
representation binaire Big Endian sera 00101101 10100101

Little Endian : l'octet de poids le plus faible (Less Significant Byte) en premier.
exemple d'un short Little endian (nota le 0x est pour la representation hexadecimal)
short value = 0x2DA5
representation binaire Big Endian sera 10100101 00101101

Java par defaut utilise Big Endian donc en general il n'y aura jamais de problème. Le problème apparaîtra lorsque vous voudrez échanger des données entre programmes écrits dans d'autres langages que Java (par exemple C/C++ sur PC...).

Lire un fichier en Little Endian
Avant de vouloir changer l'ordre des octets il vous faut d'abord lire votre flux octet par octet. D'ou l'utilisation des methodes readByte() du package java.io ou le faire a la main en utilisant les bons masques et surement l'opérateur >> et << (décalage de bits)

<comment>Convertir un short Little Endian en short Big Endian</comment><comment>short 16bits (2 octets)</comment>int lowValue = readbyte() & 0xff;int highValue = readbyte() & 0xff;short value = (short )(lowValue << 8 | highValue);
<comment>Convertir un int Little Endian en short Big Endian</comment><comment>integer 32bits (4 octets)</comment>int valueBE = 0;valueBE = ((byte4 & 0xff) << 24)|((byte3 & 0xff)<<16)|((byte2 & 0xff) << 8)|(byte1 & 0xff);
lien :
lien : http://java.sun.com/products/jdk/1.1/docs/api/java.io.DataInput.html

Comment lancer une application sans le terminal (Windows uniquement) ?
auteur : Clément Cunin
Lorsque l'on exécute une application Java sous windows, un terminal de commande permet d'afficher les entrées/sorties de l'application. Si vous souhaitez exécuter votre application sans le terminal, il suffit d'utiliser javaw.exe à la place de java.exe

javaw -CLASSPATH ... monAppli
Une deuxième solution consiste à créer une archive Jar contenant tous les fichiers de l'application et un fichier 'manifest'. De cette manière, il suffit alors de double-clicker sur le fichier jar pour l'exécuter.
Pour plus d'informations, lire : Comment créer un Jar exécutable ?


Comment lire/écrire du texte dans le presse-papier ?
auteur : Clément Cunin
L'accès au presse-papier se fait grâce à la classe <javaClass class="java.awt.datatransfer.Clipboard" /> disponible dans la boite à outils (<javaClass class="java.awt.Toolkit"/>).

Lire du texte :

<comment>Lecture du contenu :</comment>Transférable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);try<comment>Vérification que le contenu est de type texte.</comment>if( t!=null && t.isDataFlavorSupported(DataFlavor.stringFlavor) )String txt = (String)t.getTransferData(DataFlavor.stringFlavor);catch( UnsupportedFlavorException e1)catch( IOException e2 )
Ecrire du texte :

tryStringSelection ss = new StringSelection("Mon Texte");Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss,null);catch( IllegalStateException )<comment>Le presse-papier n'est pas disponible</comment>
lien : Comment dessiner en Java ?

Comment gérer les fermetures accidentelles ( Contrôle-C et kill -9 ) ?
auteur : Johann Heymes
Contrôle-C, kill -9 et autres sont des méthodes permettant d'arrêter l'exécution du programme sans lui demander son avis. Pourtant, il est parfois nécessaire de faire au moins quelques instructions capitales telles que la fermeture de flux de fichier, d'une connexion réseaux ou une sauvegarde rapide. Pour se faire il est possible de définir un 'ShutdownHook' ce qui se traduit par un thread exécuté à la réception du signal de fin d'exécution.

Attention :
Ce traitement final sera également exécuté lors de l'arrêt normal de l'application.

téléchargement : Exemple d'implémentation.

Comment forcer le passage du 'Garbage collector' ?
auteur : Clément Cunin
Le garbage Collector (rammasse miette) est la partie de la JVM qui s'occupe de la récupération des zones mémoires. Les phases de libération de la mémoire sont gérées de façon autonome, il est inutile de lui dire quand passer.

Il existe néanmoins la fonction <javaMethode methode="gc" class="java.lang.System"/> de la classe <javaClass class="java.lang.System"/> qui permet de faire un appel explicite au garbage collector. Cet appel ne garantit pas que tous les objets inutiles seront supprimés de la mémoire.

<comment>Appel explicite au Garbage collector :</comment>System.gc ();

Comment lire des informations sur l'entrée standard ?
auteur : Clément Cunin
L'entrée standard est accessible au programmeur grâce au flux 'in' de la classe <javaClass class="java.lang.System"/>. Si vous exécutez votre application dans une console, l'entrée standard contiendra tous les caractères entrés au clavier dans la console. La manipulation directe du flux n'étant pas très aisée, une petite conversion en <javaClass class="java.io.BufferedReader"/> s'impose.

<comment>Convertion du flux en BufferedReader</comment>BufferedReader entree = new BufferedReader(new InputStreamReader(System.in));try<comment>Lecture d'une ligne :</comment>entree.readline();catch( IOException e )e.printStackTrace();
Note : La lecture d'une ligne est une méthode dite 'blocante', tant que l'utilisateur n'a pas fait 'entrée', le processus attends.


Comment annuler la construction d'un objet lors de la construction ?
auteur : Clément Cunin
Si les paramètres passés au constructeur sont incohérents ou que la construction provoque une erreur, la création de l'objet est impossible et doit être annulée. Comme les méthodes, les constructeurs peuvent lever des exceptions, c'est la façon la plus simple d'annuler l'exécution du constructeur. Techniquement, l'objet est créer en mémoire (l'allocation de la mémoire a lieu au moment de l'appel du constructeur) mais l'appelant étant obligé de traiter l'exception, le pointeur vers cette objet est perdu et sera donc recupéré par le ramasse-miettes.

Une solution plus élégante consiste à utiliser par une méthode statique qui verifie les paramètres et ne fait l'appel au constructeur que si ceux-ci sont corrects.

public class Test<comment>Le constructeur est déclaré protected pour interdire son utilisation par les clients de la classe.</comment>protected Test(int val) public static Test createTest( int val )if( val<100 )return( new Test(val) );elsereturn( null);<comment>Ou alors on lève une exception...</comment>


Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduit en français ici.
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.